有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指 令:A, B, L, R,分
别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指 令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。
下列使用Dec++编译的代码:
#include <iostream>
char a[5][5]={ 'T','R','G','S','J',
'X','D','O','K','I',
'M',' ','V','L','N',
'W','P','A','B','E',
'U','Q','H','C','F' };
int main()
{
char c = 0;
int error1 = 0,error2 =0;
int i = 2,j = 1;//原空格位置 i行j列
while(scanf("%c",&c) && c != '0' )
{
char t = 0;
if( 5 == j+1 || 5 == i+1)//判断数组溢出
{
error2 = 1;
break;
}
switch(c)
{
case 'A': t=a[i-1][j];
a[i-1][j] = a[i][j];
a[i][j] =t;
i--;
//printf("%d,%d\n",i,j);
break;
case 'B': t=a[i+1][j];
a[i+1][j] = a[i][j];
a[i][j] =t;
i++;
//printf("%d,%d\n",i,j);
break;
case 'L': t=a[i][j-1];
a[i][j-1] = a[i][j];
a[i][j] =t;
j--;
//printf("%d,%d\n",i,j);
break;
case 'R': t=a[i][j+1];
a[i][j+1] = a[i][j];
a[i][j] =t;
j++;
//printf("%d,%d\n",i,j);
break;
case '0': break;
default: error1 = 1;
break;
}
}
if(error1 || error2)
printf("This puzzle has no final configuration.");
else
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
printf("%c ",a[i][j]);
if(4 == j)
printf("\n");
}
}
return 0;
}