例题3-3 回文词 Palindromes UVA 401

这么简洁的算法我没有想到。这个题目算法如此简洁的原因在于常量数组m(存放镜像元素)的应用和镜像字符转化函数的定义、使用。

程序中有好几个注意点,我会在代码中提及。

#include <bits/stdc++.h>
using namespace std;
const char *m="A   3  HIL JM O   2TUVWXY51SE Z  8 ";
const char *pf[]={"not a palindrome.","a regular palindrome.","a mirrored string.","a mirrored palindrome."};
char ex(char c)   {
    if (isalpha(c)) return m[c-'A'];
    else    return m[c-'0'+25];     //注意是c-'0'+25,而不是c+25,因为c是个char型
}
int main()  {
    char s[1005];
    while (scanf("%s",s)==1)  {
        int pali=1,mirr=1;
        int len=strlen(s);
        for (int i=0;i<(len+1)/2;i++)   {                    //i=0;i<(len+1)/2,这个设定恰好可以遍历到前面的所有元素,记住了,不要每次做类似的题都再算一遍
            if (s[i]!=s[len-1-i])   pali=0;                        //下标(len-i-1)恰好为下标i在数列中的对称元素,记住了
            if (ex(s[i])!=s[len-1-i])   mirr=0;
        }
        printf("%s -- is %s\n\n",s,pf[pali+2*mirr]);    //列一个解的方阵即可知,这样计算的结果恰好对应于p[]集合中的答案字符串,这个构造极其巧妙
    }
    return 0;
}

posted @ 2018-09-11 16:45  CF过2100就买ARCTERYX  阅读(105)  评论(0编辑  收藏  举报