/* 这题debug了好久,一直都没有找到错误,后来发现,是因为样例数据的格式有些神奇...比较难调,以及有些别的细节,因为自己观察不细致,也没有发现...导致所有的bug都只能一点点发现 1. 不要选C++5.3.0,应该按照 C++11 5.3.0,好像前者已经废除了gets(),总之如果用前者,编译错 2. 注意观察输入的数据,有一种比较特殊的情况,空格在某行的最后一列,而此空行后,就是字符串结束符,这种情况要单独处理,将结束符换为空格...我当时自己写show()函数检查输出时,就发现了有很多位置不对劲的NULL,现在想来,这就是一个很重要的提示了,毕竟学过,结束符就是NULL...后来加上 if (maps[i][4] == ' ') 这种情况的处理,格式就没问题了 所以,注意观察输入数据的格式,十分重要,uva许多题目,对格式的处理都需要十分注意,最好先全部复制到一个txt,所有的行尾有没有空格,有没有回车,或者行尾是直接的结束符,都要考虑...关键是,基础知识也要敏感,比如看到NULL要立刻反应过来,是行尾的换行符导致的,而我之前,就不太敏感... 3.注意指令的输入后,要把换行符接受了,否则换行符会作为下一组的maps[0],那样就再也退出不了了...我好像就是这么把vj弄崩了一次... 4.注意指令除了ABLR以外,还有可能出现换行符,有换行符就跳过,此外的字符一定非法,故而default 处一定要直接 return 0; (BTW,鉴于UVA奇葩数据格式的先例,平时其实还需要考虑更多:有没有结束符,有没有空格,对这题而言,这两个如果有,也跳过当作合法数据,不处理,至于遇到0的ASCII码不再接收字符,这个容易想到,但是要做两个处理,一个接受后面的换行符或结束符,一个字符串末加结束符...) 这两步的处理并不能合写为一步,cmd[k] = getchar(); ,否则WA,因为...说过了getchar()到的不一定是结束符,还可能是换行符*/
#include <bits/stdc++.h> using namespace std; //#define debug char maps[5][10]; int bx, by; char cmd[1100]; void show() { cout << endl << "test:" << endl; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) cout << maps[i][j] << " "; cout << endl; } cout << endl; } int is_legal(int op) { int x = bx, y = by; switch(op) { case 'A': x--;break; case 'B': x++;break; case 'L': y--;break; case 'R': y++;break; default : return 0; } if (x < 0 || x > 4 || y < 0 || y > 4) return 0; maps[bx][by] = maps[x][y]; maps[x][y] = ' '; bx = x; by = y; return 1; } int main() { #ifdef debug freopen("E:\in.txt", "r", stdin); freopen("E:\test.txt", "w", stdout); #endif int kase = 0; while (1) { // memset(maps, 0, sizeof(maps)); kase++; for (int i = 0; i < 5; i++) { gets(maps[i]); if (maps[0][0] == 'Z') return 0; if (maps[i][4] == ' ') { maps[i][4] = ' '; // cout << "yes, test!" << endl; } } for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) if (maps[i][j] == ' ') { bx = i; by = j; } int op, flag = 1, k = 0; while ((op = getchar()) != '0') { cmd[k++] = op; } getchar(); cmd[k] = ' '; for (k = 0; cmd[k]; k++) { if (cmd[k] == ' ') continue; flag = is_legal(cmd[k]); if (!flag) break; } if (kase != 1) cout << endl; cout << "Puzzle #" << kase << ":" << endl; if (!flag) cout << "This puzzle has no final configuration." << endl; else { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (j) cout << " "; cout << maps[i][j]; } cout << endl; } } } #ifdef debug fclose(stdin); fclose(stdout); #endif return 0; }