uva401Palindromes(迴文串和鏡像串的判斷)

輸入一個字符串,判斷它是否爲迴文串以及鏡像串。輸入字符串保證不含數字0。所謂迴文串,就是反轉以後與原串相同,如abba和madam。所謂鏡像串,就是左右鏡像之後和原串相同,如2S和3AIAE。注意,並不是每個字符在鏡像之後都能得到一個合法字符。(空白項表示該字符鏡像後不能得到一個合法字符。)

Character Reverse Character Reverse Character Reverse
A A M M Y Y
B N Z 5
C O O 1 1
D P 2 S
E 3 Q 3 E
F R 4
G S 2 5 Z
H H T T 6
I I U U 7
J L V V 8 8
K W W 9
L J X X
輸入的每行包含一個字符串,(保證只有上述字符。不含空白字符),判斷它是否爲迴文串和鏡像串(共四種組合)。每組數據之後輸出一個空行。
樣例輸入:
NOTAPALINDROME
ISAPALINILAPASI
2A3MEAS
ATOYOTA
樣例輸出:
NOTAPALINDROME – is not a palindrome.

ISAPALINILAPASI – is a regular palindrome.

2A3MEAS – is a mirrored string.

ATOYOTA – is a mirrored palindrome.


思路:
自定義了函數char r(char ch),參數ch是一個字符,返回值是ch的鏡像字符
isalpha是用來判斷字符是否爲字母的,類似的還有idigit,isprint等等

#include <cstdio>
#include <cstring>
#include <cctype>
const char* rev="A   3  HIL JM O   2TUVWXY51SE Z  8 ";//這個字符數組用來存放所有字符的鏡像字符,用於後面的檢查
const char* msg[]={"既不是迴文串也不是鏡像串","僅是迴文串","僅是鏡像串","既是迴文串也是鏡像串"};
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;//p是迴文串的判斷標誌,m是鏡像串的判斷標誌
        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 -- %s.\n\n",s,msg[m*2+p]);/*一個很簡潔的輸出形式--msg[m*2+p]這個巧妙地輸出形式,因爲一種只有4種輸出可能,可以理解爲00,01,10,11,p和m分別表示二進制的兩位。這麼做避免了用判斷語句進行一一判斷再輸出。  
        if ( P && M ) 11
        if ( P && !M ) 10
        if ( !P && M ) 01
        if ( !P && !M ) 00
        */
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章