题目
有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。
一共有4中指令:A,B,L,R,分别表示把空格上、下、左、右的相邻字母移动到空格中。
输入初始网格和指令序列(以数字0结束),输入指令执行完毕后的网格。
如果有非法指令,应输出“This puzzle has no final configuration.”,例如,
图中执行ARRBBL0后,效果如下:
分析
首先要解决输入问题,因为这里有空格,不能直接使用scanf语句。可以用for循环解决。
然后是需要记录空格的位置,之后根据命令进行移动。
但是需要判断命令字符是否合法及是否已经移动到边界。
c实现
代码语言:javascript复制#include<stdio.h>
#include<string.h>
#define maxn 10000
char a[8][8];
char command[maxn];
int main()
{
//blank_x,blank_y标记空格位置;flag标记指令是否合法
int blank_x,blank_y,flag=1;
for(int i=0;i<5;i )
{
for(int j=0;j<5;j )
{
a[i][j]=getchar();
}
}
printf("效果:n");
for(int i=0;i<5;i )
{
for(int j=0;j<5;j )
{
printf("%c ",a[i][j]);
}
printf("n");
}
//检测空格位置
for(int i=0;i<5;i ){
for(int j=0;j<5;j ){
if(a[i][j]==' '){
blank_x = i;
blank_y = j;
}
}
}
scanf("%s",command);
int n = strlen(command);
if(command[n-1]=='0'){
for(int i=0;i<n-1;i )
{
if(command[i]=='A'||command[i]=='B'||command[i]=='L'||command[i]=='R'){
if(command[i]=='A'&&blank_x>0){
a[blank_x][blank_y] = a[blank_x-1][blank_y];
a[--blank_x][blank_y] = ' '; //这里移动后的位置的值置为空格,要使用a[--blank_x],而不能用a[blank_x-1]
}
if(command[i]=='B'&&blank_x<4){
a[blank_x][blank_y]=a[blank_x 1][blank_y];
a[ blank_x][blank_y]=' ';
}
if(command[i]=='L'&&blank_y>0){
a[blank_x][blank_y]=a[blank_x][blank_y-1];
a[blank_x][--blank_y]=' ';
}
if(command[i]=='R'&&blank_y<4){
a[blank_x][blank_y]=a[blank_x][blank_y 1];
a[blank_x][ blank_y]=' ';
}
}else{
flag=0;
break;
}
}
}else{
flag=0;
}
//结果输出
if(flag){
for(int i=0;i<5;i )
{
for(int j=0;j<5;j )
{
printf("%c ",a[i][j]);
}
printf("n");
}
}else{
printf("This puzzle has no final configuration.");
}
return 0;
}
要使用a[--blank_x],而不能用a[blank_x-1]
这里做下说明,因为这里1.不仅要给a[blank-1]赋值为空格,而且2.需要更新空格blank_x的值,即blank_x也已经改变了。
所以使用a[--blank_x]来完成这两个作用。