这是回归以后发表的第一道UVa的题目,略感吃力,望再接再厉!(貌似以前做过了)
此题要判断输入的字符串的性质,性质一:该串既不是回文串也不是镜像串(即将该串反转过来,并将每个字符用相应的反转字符后,仍和原串一样),性质二:该串是回文串但不是镜像串,性质三:该串是镜像串但不是回文串,性质四:该串既是回文串又是镜像串。
思路清晰简单,但刚开是我一直在思考数字'0'和字母‘O’的问题(其实此问题可以忽略,被题目中的这句话“Note that O (zero) and 0 (the letter) are considered the same character and thereforeONLY the letter "0" is a valid character.” 给误导了),从而忽略了字符‘B’这样的字符也是有反转字符的,它们的反转字符是空格或者也可以是其他的无效字符。WA了好多次的说~~~
正确代码如下:
#include<string.h>
#include<stdio.h>
const int MAXS=1000000;
char s[MAXS];
char ch[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
char re[]="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
int main()
{
while(scanf("%s",s)!=EOF){
int p=1,m=1;
int leng=strlen(s);
for(int i=0;i<leng/2;++i)
if(s[i]!=s[leng-i-1]){ p=0; break;}
for(int i=0;i<leng;++i){
char r;
if(s[leng-i-1]>=65&&s[leng-i-1]<=90)
r=re[s[leng-i-1]-'A'];
else
r=re[s[leng-i-1]-'0'+25];
if(s[i]!=r){ m=0; break;}
}
if(!p&&!m)
printf("%s -- is not a palindrome.\n\n",s);
if(p&&!m)
printf("%s -- is a regular palindrome.\n\n",s);
if(!p&&m)
printf("%s -- is a mirrored string.\n\n",s);
if(p&&m)
printf("%s -- is a mirrored palindrome.\n\n",s);
}
return 0;
}
--------------------------------------------------------------------------------------------
Keep It Simple,Stupid!
--------------------------------------------------------------------------------------------