天天看點

【算法】HDOJ-1048  The Hardest Problem Ever

 //杭電ACM - 1048

The Hardest Problem Ever

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 11958    Accepted Submission(s): 5400

Problem Description

Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever faced was keeping himself alive. In order for him to survive, he decided to create one of the first ciphers. This cipher was so incredibly sound, that no one could figure it out without knowing how it worked.

You are a sub captain of Caesar's army. It is your job to decipher the messages sent by Caesar and provide to your general. The code is simple. For each letter in a plaintext message, you shift it five places to the right to create the secure message (i.e., if the letter is 'A', the cipher text would be 'F'). Since you are creating plain text out of Caesar's messages, you will do the opposite:

Cipher text

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Plain text

V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

Only letters are shifted in this cipher. Any non-alphabetical character should remain the same, and all alphabetical characters will be upper case.

Input

Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets. All characters will be uppercase.

A single data set has 3 components:

Start line - A single line, "START"

Cipher message - A single line containing from one to two hundred characters, inclusive, comprising a single message from Caesar

End line - A single line, "END"

Following the final data set will be a single line, "ENDOFINPUT".

Output

For each data set, there will be exactly one line of output. This is the original message by Caesar.

Sample Input

START NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX END START N BTZQI WFYMJW GJ KNWXY NS F QNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ END START IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ END ENDOFINPUT

Sample Output

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE

Source

South Central USA 2002

My code

#include <iostream>

using namespace std;

 

int main()

{

    int i,j;

    string line = "a",line2 = "a";

    char c;

 

    while( getline(cin,line) ){           //排錯:讀取第一行字元串,賦給word。如果讀取失敗,退出循環。

 

        if(line == "ENDOFINPUT") return 0;    //排錯:如果新的一組開頭是“ENDOFINPUT”,return 0,程式結束。此時word值為“ENDOFINPUT”。

        else if(line == "START"){              //正确:如果新的一組開頭是“START”,繼續檢測。此時word值為“START”

            while( getline(cin,line) ){

                if( line == "END" ) break;     //如果遇到“END”,退出循環。

 

                else {                         //為要翻譯的語句

                    line2=line;

                    for(i=0;line[i]!='\0';i++){ //循環到這一句最後。

                        if( 'A'<=line[i] && line[i]<='E' )

                            line2[i]=line[i]+21;

                        else if( 'F'<=line[i] && line[i]<='Z' )

                            line2[i]=line[i]-5;

                    }

                }

                cout<<line2<<endl;

            }

        }

        else return 0;                          //排錯:如果輸入既不是START也不是ENDOFINPUT,說明有錯,return0程式結束。

    }

    return 0;

}

           

算法分析:

主要運用到getline()函數,讀取每一行的字元串。

C文法:      char buf[20]; 

     gets(buf); C++文法:      如果用string buf;來儲存:      getline( cin , buf );      原型:      istream& getline ( istream &is , string &str , char delim );      函數在輸入流is中遇到檔案結束符(EOF)或者在讀入字元的過程中遇到錯誤都會結束。      在遇到終結符delim後,delim會被丢棄,不存入str中。在下次讀入操作時,将在delim的下個字元開始讀入。      如果用char buf[ 255 ]; 來儲存:

     cin.getline( buf, 255 );   主要思路:      1、判斷本句是否為需要翻譯的語句。      2、若是翻譯。 分析:      主要有兩個while嵌套循環。      第一個循環作用是循環“組”,并判斷讀取的這行是否為“START”或“ENDOFINPUT”。如果是“START”表示一個“組”開始,繼續讀取下一行;如果是“ENDOFINPUT”表示“組”讀取結束,return 0 程式結束。      第二個循環作用是循環“組的内容”,即組内需要翻譯的部分,它可以是多行。它判斷讀取的新一行字元串是否為“END”。如果是,則表示需要翻譯的内容結束,break跳出循環,繼續下一組的循環。如果不是“END”,表示改行讀取的是翻譯内容。然後列一個for循環進行翻譯。

繼續閱讀