题目链接:https://vjudge.net/problem/UVA-227
注意:
1、交换格子位置的时候注意不要乱用++i这样的操作,如swap(frame[ii][jj],frame[++ii][jj]);,应该分两行写。
2、使用getchar()函数的时候一定要注意吸收无效字符。
3、输出时注意两个结果之间要有空行(换行之后还要换行),但是最后一个结果后面无需空行。
4、输入测试样例的时候,如果是复制粘贴那么如果换行之前有空格的话,将不会有空格输入,如:ABC(空格)\n,这样只会输入ABC,导致程序结果出错。但是OJ中的数据是会加上此空格的,所以在程序中不用考虑这种情况,自己测试时注意手动输入空格即可。
AC代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
char frame[5][5], t;
int ii, jj, count = 0;
bool flag;
while(true)
{
flag = true;
t = getchar();
while (t == '\n')
t = getchar();
if (t == 'Z')
return 0;
for(int i = 0; i < 5 ; i++)
for(int j = 0; j < 5; j++)
{
while (t == '\n')
t = getchar();
frame[i][j] = t;
if (frame[i][j] == ' ')
{
ii = i;
jj = j;
}
t = getchar();
}
flag = true;
while(true)
{
while(t == '\n')
t = getchar();
if (t == '0')
break;
if(t == 'A')
{
if(ii-1 < 0)
{
flag = false;
break;
}
swap(frame[ii][jj],frame[ii-1][jj]);
ii--;
}
else if(t == 'B')
{
if(ii+1 > 4)
{
flag = false;
break;
}
swap(frame[ii][jj],frame[ii+1][jj]);
ii++;
}
else if(t == 'L')
{
if(jj-1 < 0)
{
flag = false;
break;
}
swap(frame[ii][jj],frame[ii][jj-1]);
jj--;
}
else if(t == 'R')
{
if(jj+1 > 4)
{
flag = false;
break;
}
swap(frame[ii][jj],frame[ii][jj+1]);
jj++;
}
t = getchar();
}
while(t != '0')
t = getchar();
if (count != 0)
printf("\n");
printf("Puzzle #%d:\n",++count);
if(flag == true)
for(int i = 0; i < 5; i++)
{
printf("%c", frame[i][0]);
for(int j = 1; j < 5; j++)
{
printf(" %c", frame[i][j]);
}
printf("\n");
}
else
printf("This puzzle has no final configuration.\n");
}
return 0;
}