题意:有5*5大小的方格,其中恰好有一个空格子,其他格子都有一个字母。输入指令A,B,L,R分别表示把空格上,下,左,右的相邻字母和空格处进行位置互换,执行到不能执行的申请内存外部分就输出“This puzzle has no final configuration.”
排雷:gets()函数要调用<cstdio>(将stdio.h的内容用C++头文件的形式表示出来),uva上报编译错误。
Runtime Error说明程序的内存方面出现了问题,比如执行互换位置的工作时要先判断能否互换。
输出格式方面相邻的输出字符之间加空格(最后不加),相邻的“Puzzle #X:”之间存在空行(最后不加)。
#include<string.h>
#include<cstdio>//将stdio.h的内容用C++头文件的形式表示出来
char square[10][10];
char command[1000];
int x, y, num, judge;//x, y记录空白位置的坐标
int count=0;
int main()
{
gets(square[0]);//读取方阵的第一行
while( square[0][0] != 'Z')//判断第一个字符是'Z'就结束
{
count++;
judge=1;//判断能否得出结果的变量
num=0;
for(int i=1; i<5; i++)
{
gets(square[i]);
}
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
if(square[i][j] == ' ')
{
x=i;
y=j;
}
}
}
while(scanf("%c", &command[num])!=EOF)//读取指令
{
if(command[num]=='0')
break;
else
num++;
}
for(int i=0; command[i]!='0'; i++)//执行指令
{
switch(command[i])
{
case 'A':
if(x-1>=0)
{
square[x][y]=square[x-1][y];
x--;
square[x][y]=' ';
}
else
judge=0;
break;
case 'B':
if(x+1<=4)
{
square[x][y]=square[x+1][y];
x++;
square[x][y]=' ';
}
else
judge=0;
break;
case 'L':
if(y-1>=0)
{
square[x][y]=square[x][y-1];
y--;
square[x][y]=' ';
}
else
judge=0;
break;
case 'R':
if(y+1<=4)
{
square[x][y]=square[x][y+1];
y++;
square[x][y]=' ';
}
else
judge=0;
break;
}
if(judge == 0)
break;
}
if(judge)//输出
{
printf("Puzzle #%d:\n", count);
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
if(j!=4)
printf("%c ", square[i][j]);
else
printf("%c", square[i][j]);
}
printf("\n");
}
}
else
{
printf("Puzzle #%d:\n", count);
printf("This puzzle has no final configuration.\n");
}
getchar();
gets(square[0]);
if(square[0][0]!='Z')
printf("\n");
}
return 0;
}