题目大意:5x5的拼图,有一个空缺,输入拼图,在输入指令,ABLR,输出最后的拼图,如果遇到不能移动,就输出“This puzzle has no final configuration.”。

解题思路:输入拼图,读取空格所在为止,根据指令移动,每次移动空格的定位也要变动。如果不可移动就跳出。ps: 用gets输入的话,不能用5*5的二维数组会出错。注意输出格式,样例复制粘贴时,自己补行末的空格。

ac代码:

#include <iostream>
#include <cstring>
using namespace std;
void swap(char &a, char &b)
{
char t;
t = a;
a = b;
b = t;
}
bool move2(char a[][50], int &x, int &y, int n, int m)
{
if ( x+n >=0 && x+n <= 4 && y+m >=0 && y+m <= 4 ){
swap(a[x][y], a[x+n][y+m]);
x = x + n;
y = y + m;
}
else
return 0;
return 1;
}
void move(char a[][50], char b[], int x, int y)
{
int judge;
for (int i=1; b[i] != '0'; i++){
if (b[i] == 'A')
judge = move2(a, x, y, -1, 0);
else if (b[i] == 'B')
judge = move2(a, x, y, 1, 0);
else if (b[i] == 'L')
judge = move2(a, x, y, 0, -1);
else if (b[i] == 'R')
judge = move2(a, x, y, 0, 1);
if (!judge)
break;
}
if (judge)
for (int i=0; i<5; i++){
for (int j=0; j<5; j++)
printf(j==0?"%c":" %c", a[i][j]);
printf("\n");
}
else
printf("This puzzle has no final configuration.\n");
}
int main()
{
char a[5][50], b[1005], c[100];
int x, y, count=1;
while (gets(a[0]) && a[0][0] != 'Z'){
for (int i=1; i<5; i++)
gets(a[i]);
b[0] = ' ';
while (scanf("%s", c)){
strcat(b, c);
if (c[ strlen(c)-1 ] == '0')
break;
}
for (int i=0; i<5; i++)
for (int j=0; j<5; j++)
if (a[i][j] == ' ')
x = i, y = j;
if (count!=1)
printf("\n");
printf("Puzzle #%d:\n", count);
count++;
move(a, b, x, y);
memset(b, 0, sizeof(b));
getchar();
}
return 0;
}