题意:给出一个字符串,判断它是不是回文串或者镜像串,详情见图中镜像字符列表。(注意字母O和数字0)
分析:镜像串例如2A3MEAS,回文串例如ISAPALINILAPASI,镜像回文串例如ATOYOTA。两个判断是独立的。
我的代码:
#include <bits/stdc++.h>
using namespace std;
char lis[]="A 3 HIL JM O 2TUVWXY51SE Z 8 ";
char f(char ch)
{
if(ch>='A'&&ch<='Z') return lis[ch-'A'];
return lis[ch-'0'+25];
}
int main()
{
char temp[50];
int i,p,q,len;
while(~scanf("%s",temp))
{
p=1,q=2,len=strlen(temp);
for(i=0;i<(len+1)/2;i++)
{
if(temp[i]!=temp[len-i-1]) p=0;
if(temp[i]!=f(temp[len-i-1])) q=0;
}
printf("%s -- is ",temp);
if(p+q==0) printf("not a palindrome.\n\n");
else if(p+q==1) printf("a regular palindrome.\n\n");
else if(p+q==2) printf("a mirrored string.\n\n");
else if(p+q==3) printf("a mirrored palindrome.\n\n");
}
return 0;
}
我交的时候WA了一发,原来是输出的时候忘记了句号。
作者示范代码:
// UVa401 Palindromes
// Rujia Liu
#include<stdio.h>
#include<string.h>
#include<ctype.h>
const char* rev = "A 3 HIL JM O 2TUVWXY51SE Z 8 ";
const char* msg[] = {"not a palindrome", "a regular palindrome", "a mirrored string", "a mirrored palindrome"};
char r(char ch) {
if(isalpha(ch)) return rev[ch - 'A'];
return rev[ch - '0' + 25];
}
int main() {
char s[30];
while(scanf("%s", s) == 1) {
int len = strlen(s);
int p = 1, m = 1;
for(int i = 0; i < (len+1)/2; i++) {
if(s[i] != s[len-1-i]) p = 0; // 不是回文串
if(r(s[i]) != s[len-1-i]) m = 0; // 不是镜像串
}
printf("%s -- is %s.\n\n", s, msg[m*2+p]);
}
return 0;
}