UVa 401 -- Palindromes
题目大意:就是输入一连串字符,判断每一行的字符串输入那一种情况,有regular palindrome,mirroredpalindrome,mirrored string, not a palindrome 四种情况,大概的判断方法已经通过表格给出。
解题过程:读入每一行字符串,然后从首尾开始判断,首先讨论两个字符是否相等,然后在相等与不相等的两种情况里继续讨论,相等字符是不是镜像对称,刚好4种情况,主要是得设置一个标记来确定输出情况。
注意: 这里最好不要用fgets读入行,因为fgets会在读入的字符串后面加上一个回车符,从而影响判断条件以及输出时回车会对输出格式有很大的干扰。
#include <stdio.h>
#include <string.h>
char one[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
char two[]="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
long len=35;
int Palindrome(char *s)
{
long begin=0,end=strlen(s)-1;
while(begin<=end)
{
if(s[begin]==s[end])
{
begin++;
end--;
}
else
return 0;
}
return 1;
}
long pos(char ch)
{
long i;
for(i=0;i<len;i++)
if(one[i]==ch)
return i;
return len;
}
int Mirror(char *s)
{
long begin=0,end=strlen(s)-1;
while(begin<=end)
{
long tmp=pos(s[begin]);
if(s[end]==two[tmp])
{
begin++;
end--;
}
else
return 0;
}
return 1;
}
int main()
{
char str[1000];
while(scanf("%s",str)!=EOF)
{
int a=0,b=0;
a=Palindrome(str);
b=Mirror(str);
if(a&&b)
printf("%s -- is a mirrored palindrome.\n",str);
else if(a)
printf("%s -- is a regular palindrome.\n",str);
else if(b)
printf("%s -- is a mirrored string.\n",str);
else
printf("%s -- is not a palindrome.\n",str);
putchar('\n');
}
return 0;
}