回文词(UVa401)
问题描述:
输入一个字符串,判断它是否为回文串以及镜像串,输入字符串保证不含数字0。所谓回文串,就是反转以后和原串相同,如abba和madam。所谓镜像串,就是左右镜像之后和原串相同,如2S和3AIAE。注意,并不是每个字符在镜像之后都能得到一个合法字符。在本题中,每个字符的镜像如图所示。(空白项表示该字符镜像后不能得到一个合法字符)。
输入的每行包含一个字符串(保证只有上述字符,不含有空白字符),判断它是否为回文串和镜像串(共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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAXA 20
char s[1000];
char zj0[]="AMYZO12E3S5HTIUJV8WLX";
char zj1[]="AMY5O1S3E2ZHTIULV8WJX";
int hui(char c)
{
int i;
for(i=0;i<strlen(zj0);i++)
{
if(c==zj0[i])
{
break;
}
}
if(i!=strlen(zj0))
{
return i;
}
else return -1;
}
int main()
{
while(scanf("%s",&s)!=EOF)
{
bool jx=false;
bool hw=false;
int len=strlen(s);
int i;
int k=len-1;
for(i=0;i<=k;i++,k--)
{
if(s[i]!=s[k])break;
}
if(i>k){
hw=true;
}
k=len-1;
for(i=0;i<=k;i++,k--)
{
if(hui(s[i])==-1) break;
if(zj1[hui(s[i])]!=s[k]) break;
}
if(i>k)
{
jx=true;
}
if(jx==false&&hw==false)
{
printf("%s -- is not a palindrome.\n\n",s);
}
if(jx==true&&hw==false)
{
printf("%s -- is a mirrored string.\n\n",s);
}
if(jx==false&&hw==true)
{
printf("%s -- is a regular palindrome.\n\n",s);
}
if(jx==true&&hw==true){
printf("%s -- is a mirrored palindrome.\n\n",s);
}
}
return 0;
}