题意:
有一个5*5的网格, 其中恰好有一个格子是空的, 其他格子各有一个字母。 一共有4种指令: A, B, L, R, 分别表示把空格上、 下、 左、 右的相邻字母移到空格中。 输入初始网格和指令序列(以数字0结束) , 输出指令执行完毕后的网格。 如果有非法指令, 应输出“This puzzle has nofinal configuration.”
题解:
这道题就是一个模拟的过程,首先找到空格的位置,然后按照指令,将空格与上下左右四个方向的字母进行交换。如果数组越界,则有非法指令,否则就执行交换。需要注意的是,要先预判数组是否会越界,然后再交换。例如,如果执行指令“A”,向上走,就要先判断x-1<0是否成立,如果成立,说明数组越界,有非法指令,不能执行交换操作。
#include<stdio.h>
#include<string.h>
void swap(char * a,char * b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
int main()
{
char a[8][8],c;
char ope[10000];
int cas=0;
int x,y;
while(1)
{
c=getchar();
if(c=='Z') break;
else
{
cas++;
a[0][0]=c;
}
if(c==' ') {x=0;y=0;}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(i==0&&j==0) continue;
a[i][j]=getchar();
if(a[i][j]==' ')
{
x=i;
y=j;
}
}
getchar();
}
int len;
len=0;
1. List item
while(1)
{
c=getchar();
if(c=='0') break;
ope[len++]=c;
}
getchar();
int flag=1;
for(int i=0;i<len;i++)
{
if(flag==0) break;
if(ope[i]=='A')
{
if(x-1<0)
{
flag=0;
break;
}
else
{
swap(&a[x-1][y],&a[x][y]);
x--;
}
}
if(ope[i]=='B')
{
if(x+1>4)
{
flag=0;
break;
}
else
{
swap(&a[x+1][y],&a[x][y]);
x++;
}
}
if(ope[i]=='L')
{
if(y-1<0)
{
flag=0;
break;
}
else
{
swap(&a[x][y-1],&a[x][y]);
y--;
}
}
if(ope[i]=='R')
{
if(y+1>4)
{
flag=0;
break;
}
else
{
swap(&a[x][y+1],&a[x][y]);
y++;
}
}
}
if(cas>1) putchar('\n');
printf("Puzzle #%d:\n",cas);
if(flag==0) printf("This puzzle has no final configuration.\n") ;
else
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
if(j==0) printf("%c",a[i][j]);
else printf(" %c",a[i][j]);
}
putchar('\n');
}
}
}
return 0;
}