UVA 401 ACM 回文数

来源:互联网 发布:cad建筑制图软件 编辑:程序博客网 时间:2024/05/19 21:04

 #include<iostream>
#include<vector>
using namespace std;
typedef enum eJudgedState{NOTHER,BOTH,PALIND,MIRRORED};
struct stReversedWord
{
    char cOriginalWord;
    char cReversedWord;
};
bool IsPalind(string szJudgedStr)
{
    bool bIsPalind = true;
    if(szJudgedStr.size() % 2 == 0)
    {
        int iLeftMiddle = szJudgedStr.size() / 2 - 1;
        int iRightMiddle = szJudgedStr.size() /2 ;
        for(int iIndexI = 0;iIndexI <= iLeftMiddle;iIndexI++)
        {
            if(szJudgedStr.at(iLeftMiddle - iIndexI) != szJudgedStr.at(iRightMiddle + iIndexI))
            {
                bIsPalind = false;
            }   
        }   
    }
    else
    {
        int iMiddle = szJudgedStr.size() / 2;
        for(int iIndexI =0; iIndexI <= iMiddle; iIndexI++)
        {
            if(szJudgedStr.at(iMiddle - iIndexI) !=  szJudgedStr.at(iMiddle + iIndexI))
            {
                bIsPalind = false;
            }   
        }    
    }       
    return bIsPalind;
}
int FindStWord(vector<stReversedWord> stWord,char cDestCh)
{
    int iReturnIndex = stWord.size();
    for(int iIndexI = 0; iIndexI <  stWord.size();iIndexI++)
    {
       if(stWord.at(iIndexI).cOriginalWord == cDestCh)
       {
           iReturnIndex = iIndexI;
           break;
       }           
    }   
   
    return iReturnIndex;
}   
void ReverseWord(string& szMirrored,int iEndIndex,vector<stReversedWord> stWord)
{
   
     for(int iIndexI =0;iIndexI < iEndIndex; iIndexI++)
     {     
        int iFindIndex = FindStWord(stWord,szMirrored.at(iIndexI));   
        if( iFindIndex == stWord.size())
        {
            szMirrored="AB";
            return;
        }
        else
        {
            szMirrored.at(iIndexI) = stWord.at(iFindIndex).cReversedWord; 
        }       
     }
}   
bool IsMirrored(string szMirrored,vector<stReversedWord> stWord)
{
   
    bool bIsMirrored = true;
    if(szMirrored.size() % 2 ==0)
    {
         ReverseWord(szMirrored,szMirrored.size() / 2,stWord);  
    }
    else
    {
        ReverseWord(szMirrored,szMirrored.size() / 2 + 1,stWord);
    }       
   
    return IsPalind(szMirrored);
}       
eJudgedState JudgeString(bool bIsPalind,bool bIsMirrored)
{
    if(bIsPalind)
    {
        if(bIsMirrored)
        {
            return BOTH;
        }   
        else
        {
            return PALIND;
        }   
    }  
    else if(bIsMirrored)
    {
        return MIRRORED;
    }
    else
    {
        return NOTHER;
    }        
}   
void PrintJudged(eJudgedState eState,string szPrintStr)
{
    switch(eState)
    {
        case NOTHER:
            cout<<szPrintStr<<" -- is not a palindrome."<<endl;
            break;
        case BOTH:
            cout<<szPrintStr<<" -- is a mirrored palindrome." <<endl;
            break;
        case PALIND:
            cout<<szPrintStr<<" -- is a regular palindrome." <<endl;
            break;
        case MIRRORED:
            cout<<szPrintStr<<" -- is a mirrored string."<<endl;
            break;
        default:
            break;
    }   
    cout<<endl;
}   

// 这个初始化写的很不好,但数据没有规律没办法。
vector<stReversedWord> InitReveredWord()
{
    vector<stReversedWord> stWord;
    struct stReversedWord word;
    word.cOriginalWord = 'Z';
    word.cReversedWord = '5';
    stWord.push_back(word);
    word.cOriginalWord = '5';
    word.cReversedWord = 'Z';
    stWord.push_back(word);
    word.cOriginalWord = 'E';
    word.cReversedWord = '3';
    stWord.push_back(word);
    word.cOriginalWord = '3';
    word.cReversedWord = 'E';
    stWord.push_back(word);
    word.cOriginalWord = 'J';
    word.cReversedWord = 'L';
    stWord.push_back(word);
    word.cOriginalWord = 'L';
    word.cReversedWord = 'J';
    stWord.push_back(word); 
    word.cOriginalWord = '2';
    word.cReversedWord = 'S';
    stWord.push_back(word); 
    word.cOriginalWord = 'S';
    word.cReversedWord = '2';
    stWord.push_back(word);
    word.cOriginalWord = 'A';
    word.cReversedWord = 'A';
    stWord.push_back(word);
    word.cOriginalWord = 'H';
    word.cReversedWord = 'H';
    stWord.push_back(word); 
    word.cOriginalWord = 'I';
    word.cReversedWord = 'I';
    stWord.push_back(word); 
    word.cOriginalWord = 'M';
    word.cReversedWord = 'M';
    stWord.push_back(word); 
    word.cOriginalWord = 'O';
    word.cReversedWord = 'O';
    stWord.push_back(word); 
    word.cOriginalWord = 'T';
    word.cReversedWord = 'T';
    stWord.push_back(word); 
    word.cOriginalWord = 'U';
    word.cReversedWord = 'U';
    stWord.push_back(word); 
    word.cOriginalWord = 'V';
    word.cReversedWord = 'V';
    stWord.push_back(word); 
    word.cOriginalWord = 'W';
    word.cReversedWord = 'W';
    stWord.push_back(word); 
    word.cOriginalWord = 'X';
    word.cReversedWord = 'X';
    stWord.push_back(word); 
    word.cOriginalWord = 'Y';
    word.cReversedWord = 'Y';
    stWord.push_back(word); 
    word.cOriginalWord = '1';
    word.cReversedWord = '1';
    stWord.push_back(word); 
    word.cOriginalWord = '8';
    word.cReversedWord = '8';
    stWord.push_back(word); 
       return stWord;
   
}   
int main()
{
    string szJudgedStr("");
    vector<stReversedWord> stWord = InitReveredWord();
       
    while((cin>>szJudgedStr))
    {
       if(szJudgedStr.size() == 1)
       {
          int iFindIndex = FindStWord(stWord,szJudgedStr.at(0));
          if(iFindIndex == stWord.size())
          {
              cout<<szJudgedStr<<" -- is a regular palindrome." <<endl<<endl;
          }  
          else if(stWord.at(iFindIndex).cOriginalWord == stWord.at(iFindIndex).cReversedWord)
          {
              cout<<szJudgedStr<<" -- is a mirrored palindrome." <<endl<<endl;
             
          }           
          else
          {
              cout<<szJudgedStr<<" -- is a regular palindrome." <<endl<<endl;
          }   
       }
       else
       {   
         bool bIsPalind   = IsPalind(szJudgedStr);
         bool bIsMirrored = IsMirrored(szJudgedStr,stWord);
         eJudgedState eState = JudgeString(bIsPalind,bIsMirrored);
         PrintJudged(eState,szJudgedStr);
       }                 
    }   
   
    return 0;
}