題目鏈接:http://poj.org/problem?id=2632
先話說昨天順利1Y之後,直到今天下午才再出題 TAT,真是刷題計劃深似海,從此AC是路人- -
本來2632是道稍微惡心點的模擬,但畢竟是模擬,一般模擬都是只要示例過了基本就AC了,但這個題很特殊
我開始的時候一直跑不出測試示例,才發現題目中的插圖和我構想的坐標系是不一樣的(看來還不能輕易忽視掉插圖啊)
這個題給出的坐標系是縱軸為y,橫軸為x,y從下到上依次遞增,x軸是從左到右遞增
而我用的二維數組記錄的地圖,也就是說我的縱向是x軸而且從上到下遞增,橫向是y軸,從左到右遞增
在我調了程序近一個小時之後才發現了這個問題。
然後突然懵了,不知道怎麼實現了。突然的全盤否定讓我瞬間沒了思路
過了一段時間我才緩過來,然後打算偷梁換柱
因為這個題目只有在定義機器人的時候才用到了坐標,在指令上沒有用到坐標
然後我就這樣想,在過程處理上依然使用數組那套坐標系,而在錄入保存的時候做些轉換
scanf ("%d%d%s",&x,&y,to); MAP[B - y][x - 1] = i; rob[i].x = B - y; rob[i].y = x - 1;
然後直接不用再管這套坐標系了
後面進展順利,很快代碼成形,調了幾組數據全過,然後一交:RE
然後趕緊看數據范圍,地圖范圍,發現我開的遠遠大於范圍最大值,因為是模擬,又沒有用指針,所以檢查了幾遍代碼,著重檢查數組下標
沒有發現問題,跑了discuss裡給的測試數據,全過,一交還是RE,卡了好久
終於沒有辦法了,只能亂改,直到AC. (= = 亂改居然改AC了)
我改的是把錄入字符改為錄入字符串,只取字符串第一個字符(s[0]),目的是不用控制空格(不過還是RE)
然後因為已經不用空格了,我把我原來控制空格回車符的fflush(stdin)----清空輸入流函數去掉
然後提交AC,至於為什麼fflush導致RE,實在不明白,百度直說了fflush並非庫函數,只是庫函數的補充,部分linux會導致不兼容
雖然不是CE,但不排除是這方面的原因。不過fflush我在處理輸入流的時候經常用,這是第一次出現問題。
fflush導致了RE,也算給自己一次警告吧。
總的來說,這個題也就是一個模擬,雖然麻煩點,但畢竟是個模擬題。
代碼如下:
#include#include #include #include struct n { int x,y; int to; }rob[10000]; int MAP[150][150]; int A,B; int mov (int no,int turn) { int x = rob[no].x,y = rob[no].y; int to = rob[no].to; //printf ("!1!%d %d\n",x,y); MAP[x][y] = -1; switch (to) { case 1: if (turn == 1) { rob[no].to = 4; //y--; }else if (turn == 2) { rob[no].to = 2; //y++; }else if (turn == 3) { x--; } break; case 2: if (turn == 1) { rob[no].to = 1; //x--; }else if (turn == 2) { rob[no].to = 3; //x++; }else if (turn == 3) { y++; } break; case 3: if (turn == 1) { rob[no].to = 2; //y++; }else if (turn == 2) { rob[no].to = 4; //y--; }else if (turn == 3) { x++; } break; case 4: if (turn == 1) { rob[no].to = 3; //x++; }else if (turn == 2) { rob[no].to = 1; //x--; }else if (turn == 3) { y--; } break; } //printf ("!2!%d %d\n",x,y); if (x < 0 || y < 0 || x >= B || y >= A) { printf ("Robot %d crashes into the wall\n",no + 1); return 0; } if (MAP[x][y] != -1) { printf ("Robot %d crashes into robot %d\n",no + 1,MAP[x][y] + 1); return 0; } rob[no].x = x; rob[no].y = y; MAP[x][y] = no; return 1; } int main() { //freopen ("1.txt","w",stdout); int N; int i,k; scanf ("%d",&N); while (N--) { int n,m; memset (MAP,-1,sizeof (MAP)); memset (rob,0,sizeof (rob)); scanf ("%d%d",&A,&B); scanf ("%d%d",&n,&m); for (i = 0;i < n;i++) { int x,y; char to[10]; //fflush (stdin); scanf ("%d%d%s",&x,&y,to); MAP[B - y][x - 1] = i; rob[i].x = B - y; rob[i].y = x - 1; if (to[0] == 'N') { rob[i].to = 1; }else if (to[0] == 'E') { rob[i].to = 2; }else if (to[0] == 'S') { rob[i].to = 3; }else if (to[0] == 'W') { rob[i].to = 4; } } int tf = 1; for (i = 0;i < m;i++) { int no,lop,iact; char act[10]; //fflush (stdin); scanf ("%d%s%d",&no,act,&lop); if (act[0] == 'L') iact = 1; else if (act[0] == 'R') iact = 2; else if (act[0] == 'F') iact = 3; for (k = 0;k < lop;k++) if (tf) tf = mov (no - 1,iact); } if (tf) puts ("OK"); } return 0; }