Puzzle, ACM/ICPC World Finals 1993, UVa227

有一个5*5的网格,其中恰好有一个格子是空的,其他格子各有一个字母。一共有4种指
令:A, B, L, R,分别表示把空格上、下、左、右的相邻字母移到空格中。输入初始网格和指
令序列(以数字0结束),输出指令执行完毕后的网格。如果有非法指令,应输出“This
puzzle has no final configuration.”,例如,图3-5中执行ARRBBL0后,效果如图3-6所示。


wKioL1YAkvujuoBXAAEPEok7qG0886.jpg

写的比较简陋,先写了容器,然后填充,写移动条件。

以下是用C写的源码:

#include<stdio.h>
#include<string.h>
int main()
{
char net[7][7],c=65,ch;int i,j;
memset(net,32,sizeof net);
for(i=1;i<6;i++)
for(j=1;j<6;j++)
net[i][j]=(c++);
net[5][5]=42;
int x=5,y=5,temp;
do{
while((c=getchar())!=EOF&&(c==65||c==66||c==76||c==82))
{
if(x>0&&x<7&&y<7&&y-1>0&&c==65)
{temp=net[y][x];net[y][x]=net[y-1][x];net[y-1][x]=temp;y--;}
if(x>0&&x<7&&y>0&&y+1<7&&c==66)
{temp=net[y][x];net[y][x]=net[y+1][x];net[y+1][x]=temp;y++;}
if(x-1>0&&x<7&&y>0&&y<7&&c==76)
{temp=net[y][x];net[y][x]=net[y][x-1];net[y][x-1]=temp;x--;}
if(x>0&&x+1<7&&y>0&&y<7&&c==82)
{temp=net[y][x];net[y][x]=net[y][x+1];net[y][x+1]=temp;x++;}
}
if(c!=65&&c!=66&&c!=76&&c!=82)
printf("The puzzle has no final configuration.\n");
for(i=0;i<7;i++) {for(j=0;j<7;j++) printf("%c",net[i][j]);printf("\n");}
}while(c!='q');
return 0;
}
~                                                                                  
~                                                                                  
~


你可能感兴趣的:(算法,ACM,uva)