[ACM ] 102 WA(已解決) (附帶請問cin 和 scanf的問題)

看板C_and_CPP (C/C++)作者時間15年前 (2010/07/12 21:22), 編輯推噓8(8024)
留言32則, 5人參與, 最新討論串1/1
剛剛改了一下結果就AC了 我想請問C/C++高手一個問題 就是cin scanf 實質上的差別或是概念上有什麼不同 cin是不是可能會讀到空白之類的 我把程式本來cin的部分換成scanf結果就過了 所以想請問一下大家(我修改過的用紅色標起來) 謝謝大家 作者: rock1985 (疾風) 看板: C_and_CPP 標題: [ACM ] 102 WA 時間: Mon Jul 12 21:21:58 2010 ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 題號: 102 遇到的問題: WA 有問題的code: (請善用置底文的標色功能) #include <iostream> #include<stdio.h> #include<cstdio> using namespace std; string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max); /*******************************/ /* glass[a][b] */ /* a is bucket number */ /* b is glass color */ /* b = 1 Brown */ /* b = 2 Green */ /* b = 3 Clean */ /*******************************/ int main(int argc, char* argv[]) { unsigned int Bucket[3][3]; int can_1, can_2, can_3; while(cin != NULL) (改這行換scnf) while (scanf("%d %d %d %d %d %d %d %d %d", &Bucket[0][0], &Bucket[0][1],&Bucket[0][2],&Bucket[1][0],&Bucket[1][1],&Bucket[1][2], &Bucket[2][0],&Bucket[2][1],&Bucket[2][2])!= EOF) { /* initiate */ unsigned int max = 0 , move = 0; unsigned int init = 0, total = 0, temp_total = 0; string s_goal = "XXX"; for(int i=0 ; i<3 ; i++) { for(int j=0 ; j<3 ; j++) { //cin>>Bucket[i][j]; (本行刪掉) total = total + Bucket[i][j]; } } for(can_1=0 ; can_1<3 ; can_1++) { init = Bucket[0][can_1]; temp_total = Bucket[0][can_1]; for(can_2=0 ; can_2<3 ; can_2++) { if(can_1 != can_2) { temp_total = temp_total + Bucket[1][can_2]; for(can_3=0 ; can_3<3 ; can_3++) { if( (can_3 != can_2) && (can_3 != can_1) ) { temp_total = temp_total + Bucket[2][can_3]; //cout<<temp_total<<endl; if(temp_total >= max) { s_goal = funct(can_1 , can_2 , can_3 , s_goal , temp_total , max); max = temp_total; } temp_total = init; } } } //temp_total = init; } } move = total - max; cout<< s_goal << " " << move <<endl; } return 0; } string funct(int c1 , int c2 , int c3 , string s_temp , int temp , int temp_max) { string str=""; int size = 0; if(c1==0){ str=str+"B"; }else if(c1==1){ str=str+"G"; }else str=str+"C"; if(c2==0){ str=str+"B"; }else if(c2==1){ str=str+"G"; }else str=str+"C"; if(c3==0){ str=str+"B"; }else if(c3==1){ str=str+"G"; }else str=str+"C"; if(temp == temp_max) { while(size < 2) { if(str[size] < s_temp[size]) return str; else if(str[size] > s_temp[size]) break; else size++; } return s_temp; } return str; } 補充說明: 本來想用6種case去討論 但是想說換個寫法,結果就快樂的WA了 請大家幫我看看是哪裡出問題了  謝謝 -- 我不是宅 我只是比較居家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.248.15.120

07/12 21:56, , 1F
這題我好像是用暴力法
07/12 21:56, 1F

07/12 22:49, , 2F
我覺得應該是最後輸出答案吧,他不是說有相同解的話
07/12 22:49, 2F

07/12 22:49, , 3F
要輸出字母順序最小的@@
07/12 22:49, 3F

07/12 22:50, , 4F
不太想用暴力法,所以我現在卡在這邊= =
07/12 22:50, 4F

07/12 22:51, , 5F
我後面有處理成字母排序,話說我暴力法也WA = =a
07/12 22:51, 5F
※ 編輯: rock1985 來自: 111.248.15.120 (07/12 23:08) ※ 編輯: rock1985 來自: 111.248.15.120 (07/12 23:10)

07/12 23:28, , 6F
因為讀到eof之類的錯誤, cin 的狀態才會改變, 這跟你
07/12 23:28, 6F

07/12 23:29, , 7F
scanf 先讀才回傳的原理一樣, 達成一樣功能通常是寫成
07/12 23:29, 7F

07/12 23:29, , 8F
while ( cin >> a >> b )
07/12 23:29, 8F

07/12 23:35, , 9F
你原本的寫法應該改成 while( cin ), 它會把cin轉成
07/12 23:35, 9F

07/12 23:36, , 10F
boolean 值, 然而因為下一個就是eof, 你還沒讀進來當
07/12 23:36, 10F

07/12 23:36, , 11F
然迴圈還是會多跑一次, 一進到迴圈讀資料的時候, 整個
07/12 23:36, 11F

07/12 23:37, , 12F
都錯掉了
07/12 23:37, 12F

07/13 00:56, , 13F
cin理論上應該永遠不會是false吧
07/13 00:56, 13F

07/13 01:00, , 14F
回板大, windows下可以用ctrl+z來標示EOF, 或是用重導
07/13 01:00, 14F

07/13 01:00, , 15F
把cin 當檔案串流來用, 有時候要讀數字卻給英文, 也會
07/13 01:00, 15F

07/13 01:01, , 16F
讓他false掉
07/13 01:01, 16F

07/13 01:05, , 17F
喔不是 我剛恍神推錯 剛是要推cin不會是null吧 Sorry
07/13 01:05, 17F

07/13 01:06, , 18F
我是看到 while(cin!=NULL) 這行覺得很神奇才問的 XD
07/13 01:06, 18F

07/13 03:36, , 19F
07/13 03:36, 19F

07/13 03:41, , 20F
07/13 03:41, 20F

07/13 19:03, , 21F
我想請問一下如果cin的部分可能有1個或是多個輸入 又有分
07/13 19:03, 21F

07/13 19:04, , 22F
int或是string 要怎麼處理會比較不容易出錯
07/13 19:04, 22F

07/13 19:07, , 23F
可以用 cin.get 先抓出來看, 再用 cin.unget 還原輸入
07/13 19:07, 23F

07/13 19:08, , 24F
不同行輸入數量不同的話可以用getline讀進字串, 再配
07/13 19:08, 24F

07/13 19:08, , 25F
嗯嗯,那迴圈的部份呢?while(cin)這個部分還是不太懂
07/13 19:08, 25F

07/13 19:08, , 26F
謝謝你
07/13 19:08, 26F

07/13 19:09, , 27F
istringstream來讀, 用 good 函式去測試狀態
07/13 19:09, 27F

07/13 19:09, , 28F
cin 物件內部有標示不同錯誤的旗標, 如果某個錯誤旗標
07/13 19:09, 28F

07/13 19:10, , 29F
被升起, 這樣寫就會讓編譯器幫我們把 cin 物件轉成
07/13 19:10, 29F

07/13 19:11, , 30F
boolean 值的 false, 狀態良好就會轉成 true, 所以可
07/13 19:11, 30F

07/13 19:12, , 31F
以當作迴圈的條件, 至於 cin >> a >> b, 的寫法也是一
07/13 19:12, 31F

07/13 19:13, , 32F
樣, 這要熟悉串接式的語法
07/13 19:13, 32F
文章代碼(AID): #1CEnRwvh (C_and_CPP)
文章代碼(AID): #1CEnRwvh (C_and_CPP)