/*
这题debug了好久,一直都没有找到错误,后来发现,是因为样例数据的格式有些神奇...比较难调,以及有些别的细节,因为自己观察不细致,也没有发现...导致所有的bug都只能一点点发现
1. 不要选C++5.3.0,应该按照 C++11 5.3.0,好像前者已经废除了gets(),总之如果用前者,编译错
2. 注意观察输入的数据,有一种比较特殊的情况,空格在某行的最后一列,而此空行后,就是字符串结束符,这种情况要单独处理,将结束符换为空格...我当时自己写show()函数检查输出时,就发现了有很多位置不对劲的NULL,现在想来,这就是一个很重要的提示了,毕竟学过,结束符就是NULL...后来加上 if (maps[i][4] == '\0') 这种情况的处理,格式就没问题了
所以,注意观察输入数据的格式,十分重要,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] == '\0')
{
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] = '\0';
for (k = 0; cmd[k]; k++)
{
if (cmd[k] == '\n') 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;
}