有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指
令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指
令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This
puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。
图3-5 执行ARRBBL0前图3-6 执行ARRBBL0后
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[5][5];
char operate[100];
int time=1;
while(1)
{
int i,j,p,q,flag=0,temp;
memset(str,'\0',sizeof(str));
memset(operate,'\0',sizeof(operate));
if (time>1)
{
gets(str[0]);
}
gets(str[0]);
if(str[0][0]=='Z')
return 0;
for(i=1; i<5; i++)
gets(str[i]);
for(i=0; ; i++)
{
operate[i] = getchar();
if(operate[i]=='0')
break;
}
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
if(str[i][j]==' ')
{
p = i;
q = j;
flag = 1;
break;
}
}
if(flag==1)
break;
}
for(i=0; i<strlen(operate)-1; i++)
{
flag = 1;
if(operate[i]=='A')
{
if(p==0)
{
flag=0;
break;
}
else
{
temp = str[p][q];
str[p][q] = str[p-1][q];
str[p-1][q] = temp;
}
p = p-1;
}
else if(operate[i]=='B')
{
if(p==4)
{
flag=0;
break;
}
else
{
temp = str[p][q];
str[p][q] = str[p+1][q];
str[p+1][q] = temp;
}
p = p+1;
}
else if(operate[i]=='L')
{
if(q==0)
{
flag=0;
break;
}
else
{
temp = str[p][q];
str[p][q] = str[p][q-1];
str[p][q-1] = temp;
}
q = q-1;
}
else if(operate[i]=='R')
{
if(q==4)
{
flag=0;
break;
}
else
{
temp = str[p][q];
str[p][q] = str[p][q+1];
str[p][q+1] = temp;
}
q = q+1;
}
}
if(time==1)
;
else
printf("\n");
printf("Puzzle #%d:\n",time);
if(flag==0)
printf("This puzzle has no final configuration.\n");
else
{
for(i=0; i<5; i++)
{
for(j=0; j<5-1; j++)
printf("%c ",str[i][j]);
printf("%c\n",str[i][j]);
}
}
time++;
}
return 0;
}