UVA41 回文词

输入一个字符串,判断它是否为回文串以及镜像串。输入字符串保证不含数字0。所谓回文串,即反转后和原串相同,如abba和madam。所谓镜像串是指左右镜像后原串相同,如 2S 和 3AIAE. 注意,并不是所有的字符在镜像之后都会得到一个合法字符。每个字符的镜像如下图所示:


Character Reverse Character Reverse Character Reverse
A A M M Y Y
B
N
Z 5
C
O O 1 1
D
P
2 S
E 3 Q
3 E
F
R
4
G
S 2 5 Z
H H T T 6
I I U U 7
J L V V 8 8
K
W W 9
L J X X

    输入的每行包括一个字符串(保证只有上述字符。不含空白字符),判断它是否为回文串和镜像串(共4种组合)。每组数据之后输出一个空行。


样例输入:

NOTAPALINDROME 

ISAPALINILAPASI 

2A3MEAS

ATOYOTA

样例输出:

NOTAPALINDROME -- is not a palindrome.


ISAPALINILAPASI -- is a regular palindrome.


2A3MEAS -- is a mirrored string.


ATOYOTA -- is a mirrored palindrome.



首先我们可以将所有的镜像字符用一个char型的指针来表示,方便之后的调用,同时将输出的对应结果用字符串数组来表示,接下来再开始具体的编程。


#include <iostream>
#include <string.h>


using namespace std;
const char * a = "A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char * b[] = {"not a palindrome","a regular palindrome","a mirrored string","a mirrored palindrome"};
const int N = 100;
char choice(char ch)
{
    if(isalpha(ch))   //判断是否为字符,若为字符则减去A的数值,就可以在数组a中找到对应的字符
        return a[ch - 'A'];
    return a [ch - '0' + 25];  //不为字符则减去数字0的数值,同时加上25,此处不是26,因为数组从0开始
}
int main()
{
    int flag1 = 1;
    int flag2 = 1;
    char c[N];
    while((cin>>c))
    {
        int len = strlen(c);
        for(int i=0;i<len/2+1;i++)
        {
            if(c[i]!=c[len-1-i])
                flag1=0;
            if(choice(c[i])!=c[len-1-i])
                flag2=0;
        }
        cout<<c<<" -- is "<<b[flag2*2+flag1]<<"."<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36719861/article/details/79308255