算法竞赛入门经典(第二版) | 习题3-5 谜题 (UVa227,Puzzle)(World Finals 1993)
乍一看是一個大水題,但World Finals這兩個詞標示著老子世界決賽真題雖然題目很水但是數據就能卡死你。整整搞了五個小時,期間經歷過崩潰(花了這么多時間搞一道大水題,還沒AC),但好在堅持下來了,不斷的搜網,交流,最后成功AC。
題目大意我就不說了,相信同學們看得都能倒著背下來了。這里說幾點限制:
(1)每個輸出之間都有一行空格,但最后一個輸出之前沒有’\n’。
 (2)‘0’之前移動序列有很多’\n’或空格,移動序列的非法只考慮越界,不考慮有其他字符。
 (3)輸入迷宮矩陣不用考慮有多個空格,樣例中如果空格出現在最后一個,則是缺失的,輸入時需要補齊。
 (4)輸出2個結果之間有空行,最后一個結果后無空行。
 最后,使用getchar()注意容易多吃或少吃字符,建議判斷每一個ch=getchar()。
上面幾點都是大牛們花了心血和時間人工測出來的,很重要!!!!!
提交(目)鏈接→UVa-227
沒使用過該網站的同學請猛戳這里→vJudge教程
代碼:
#include <iostream> #include <algorithm> #include <string>using namespace std ;int main() {char c ;int num = 0 ; //計數器 int num1, num2 ; //二維數組空格的橫、縱坐標 while((c=getchar() )&& c != 'Z') { char a[5][5] ;a[0][0] = c ; if(c==' ') {num1 = 0 ; num2 = 0 ;} //二維數組賦值 for(int i = 0; i < 5; i++) {for(int j = 0; j < 5; j++) {if(i != 0 || j != 0) {a[i][j] = c = getchar() ;(c == ' ' ) ? (num1=i,num2=j) : (i = i) ; //冒號后面湊字數 }} getchar() ; //吸收回車 } //輸入修改序列bool flag = false ; string s ; //用string比較方便 while(char r = getchar()) { if(r=='0') break ;else if(r==' ') continue ;else s+=r; }getchar() ; //修改序列后有一個回車,會被第一個c字符的getchar接受到 int len = s.length() ;//ABLR分別對應不同操作。for(int i = 0; i < len; i++) { //可以換成auto // cout << num1 <<' '<< num2 << endl ;if(s[i] == 'A') {int n1 = num1 , n2 = num2 ; //空格所在行列和待交換字符所在行列 num1-- ;if((num1>=0)&&(num1<5)&&(num2>=0)&&(num2<5)) swap(a[n1][n2],a[num1][num2]) ;else {flag=true ;break; }}else if(s[i] == 'B') {int n1 = num1 , n2 = num2 ; //空格所在行列和待交換字符所在行列 num1++ ;if((num1>=0)&&(num1<5)&&(num2>=0)&&(num2<5)) swap(a[n1][n2],a[num1][num2]) ;else {flag=true ;break; }}else if(s[i] == 'L') {int n1 = num1 , n2 = num2 ; //空格所在行列和待交換字符所在行列 num2-- ;if((num1>=0)&&(num1<5)&&(num2>=0)&&(num2<5)) swap(a[n1][n2],a[num1][num2]) ;else {flag=true ;break; }}else if(s[i] == 'R') {int n1 = num1 , n2 = num2 ; //空格所在行列和待交換字符所在行列 num2++ ;if((num1>=0)&&(num1<5)&&(num2>=0)&&(num2<5)) swap(a[n1][n2],a[num1][num2]) ;else {flag=true ;break; }}} //輸出: num++ ; if(num != 1) cout << endl ; cout << "Puzzle #" << num <<":" << endl ; if(flag==false) for(int i = 0; i < 5; i++) {for(int j = 0; j < 5; j++) { if(j != 0) cout << ' ' ;cout << a[i][j] ;} cout << endl ;}else cout << "This puzzle has no final configuration." << endl ;}return 0 ; }總結:
這是極其考驗標準輸入輸出的題,經過這次的折磨,我相信大家會大大減少在輸入輸出上面的出錯。
收獲:
1、getline()無法存入回車。 getchar()既能存入回車,也能存入空格。 cin和scanf都gg了
 2、使用getchar()注意容易多吃或少吃字符,比如在第一次輸入數據后按的回車,如果不及時吃掉, 就會被第二次輸入的第一個數據吃掉。
 3、輸出格式必須與答案嚴格一樣。(每個答案間有幾個回車,每行后無空格)
最后分享一條大牛的建議(對筆者受益匪淺):算法最好有人帶著學,如果條件不允許,一定要到網絡上廣泛交流、學習。
總結
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 习题3-5 谜题 (UVa227,Puzzle)(World Finals 1993)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 13行代码AC_习题3-9 子序列 (U
- 下一篇: 算法竞赛入门经典(第二版) | 例题4-
