前几天在做HDU2059龟兔赛跑问题
没弄出来, 然后干了点别的, 今天写了个水题没细心错了好些次
不应该。
#include <iostream>
//UVa必须加上
#include <cstdio>
#include <cstring>
using namespace std;
char rev[22] = { 'A', '3', 'H', 'I', 'L', 'J', 'M', 'O', '2',
'T', 'U', 'V', 'W', 'X', 'Y', '5', '1', 'S',
'E', 'Z', '8' };
char old[22] = { 'A', 'E', 'H', 'I', 'J', 'L', 'M', 'O', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2',
'3', '5', '8' };
int Reverse (char ch)
{
int i;
for (i = 0; i < 21; i++)
if (ch == rev[i])
return i + 1;
return 0;
}
int isReverseEqual (char ch1, char ch2)
{
int pos = Reverse(ch2);
if (ch1 == old[pos-1])
return 1;
return 0;
}
int main()
{
int i, n, palindrome, mirrored;
char str[2000], temp[2000];
while (scanf("%s", str) != EOF)
{
n = strlen(str);
palindrome = mirrored = 1;
//判断是否回文字符串
for (i = 0; i <= n / 2; i++)
if (str[i] != str[n-i-1])
{
//少判断了0和O的区别
if (str[i] == '0' && str[n-i-1] == 'O' || str[i] == 'O' && str[n-i-1] == '0')
continue;
palindrome = 0;
break;
}
//判断是否镜像字符串;
for (i = 0; i <= n / 2; i++)
if (!(Reverse(str[i]) && Reverse(str[n-i-1])
&& isReverseEqual(str[i], str[n-i-1])))
{
if (str[i] == '0' && str[n-i-1] == 'O' || str[i] == 'O' && str[n-i-1] == '0')
continue;
mirrored = 0;
break;
}
if (palindrome && mirrored)
printf("%s -- is a mirrored palindrome.\n\n", str);
else if (palindrome)
printf("%s -- is a regular palindrome.\n\n", str);
else if (mirrored)
printf("%s -- is a mirrored string.\n\n", str);
else
printf("%s -- is not a palindrome.\n\n", str);
}
return 0;
}