【OJ-UVa227】

耗時一週。哭。html

本題重在輸入輸出。因此對英文題目的理解很是重要。看清楚題目,省時省力。ios

題目要點:

一、開始有5×5的數據,每行僅有5個字符。注意:樣例輸入中的尾部空格是沒法複製的(UVa官網上),實際上是有的,因此不用考慮有多個空格或略過行尾空格直接換行的狀況(我當時看樣例輸入行尾空格被略過直接換行,而大費周折)。git

Each display line contains exactly 5 characters, beginning with the character on the leftmost square spa

二、動做指令僅有 A B L R  組成,可不用考慮其它非法字符,可是要考慮換行符。code

The sequence of moves is represented by a sequence of As, Bs, Rs htm

三、動做指令能夠出現多行,總以 0 結束。blog

This sequence of moves may be spread over several lines, but it always ends in the digit 0 get

四、輸出格式有特殊要求:兩個謎題puzzle中間用空行隔開。博客

Separate output from different puzzle records by one blank line.
it

 

簡單清晰的AC代碼可參考這裏。以防該博客被刪,我粘貼到下面。

順便寫個註解。

一、讀取單個字符存儲到 s[5][5] 中

二、判斷首個字符 是否 'Z'

三、順便找出 空格符

四、吞掉5*5數據每行末尾的 換行符

這樣,5*5的數據就存儲好了。

 

一、讀取動做指令,進行移動(和拼圖相似)

  1.一、判斷動做指令是否合規

  1.二、空格和要移動的字符互換值

  1.三、更新空格的座標

二、吞掉結束標誌字符 0 

三、若是是首個puzzle,不輸出\n(若是不是首個puzzle,則輸出每兩個puzzle的中間空行)

四、打印 Puzzle #1:

五、第一列字符,打印 字符,第二列到第五列,打印 字符+空格,最後每行補個 \n 換行符

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 void Swap(char &s1,char &s2);
 5 
 6 int main()
 7 {
 8     char ans,s[5][5];
 9     int dx,dy,Case=0;//用於儲存空格位置
10     while(true){
11       bool flag=true;
12       for(int i=0;i<5;i++){
13         for(int j=0;j<5;j++){
14           scanf("%c",&s[i][j]);
15           if(s[0][0]=='Z')  return 0;
16           if(s[i][j]==' '){
17             dx=i; dy=j;
18           }
19         }
20         getchar();
21       }
22       while((ans=getchar())!='0'){
23         if(ans=='A'&&dx-1>=0){
24             Swap(s[dx][dy],s[dx-1][dy]);
25             dx-=1;
26         }
27         else if(ans=='B'&&dx+1<=4){
28             Swap(s[dx][dy],s[dx+1][dy]);
29             dx+=1;
30         }
31         else if(ans=='L'&&dy-1>=0){
32             Swap(s[dx][dy],s[dx][dy-1]);
33             dy-=1;
34         }
35         else if(ans=='R'&&dy+1<=4){
36             Swap(s[dx][dy],s[dx][dy+1]);
37             dy+=1;
38         }
39         else if(ans!='\n') flag=false;
40       }
41       getchar();
42       if(Case)  printf("\n");
43       printf("Puzzle #%d:\n",++Case);
44       if(flag){
45         for(int i=0;i<5;i++){
46           for(int j=0;j<5;j++)
47             if(!j) printf("%c",s[i][j]);
48             else printf(" %c",s[i][j]);
49             printf("\n");
50         }
51       }
52       else
53         printf("This puzzle has no final configuration.\n");
54     }
55     return 0;
56 }
57 void Swap(char &s1,char &s2){
58     char c=s1;
59     s1=s2;
60     s2=c;
61 }
本站公眾號
   歡迎關注本站公眾號,獲取更多信息