原文网址:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=163
比较麻烦的一道题,格式的控制真是醉了,调试了一上午才解决..............
#include<stdio.h>
#include<string.h>
int t=0,a,b,kase;
char x[6][6],s[10005];
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1},dt[26];
int legal(char ch,int &a,int &b)
{
int ta=a,tb=b,tp=dt[ch-'A'];//保留之前的位置
a=ta+dx[tp],b=tb+dy[tp];//操作之后的位置
if(a<0||a>4||b<0||b>4)//判断是否合法
{
return 0;
}
tp=x[ta][tb];x[ta][tb]=x[a][b];x[a][b]=tp;//交换,移动
return 1;
}
void slove()
{
for(int i=0;i<5;++i)//定位空格!
{
for(int j=0;j<5;++j)
{
if(x[i][j]==' '||x[i][j]=='\0')//注意可能是空格,或者是空
{
a=i;b=j;x[i][j]=' ';//记录位置
}
}
}
for(int i=0;s[i]!='0';++i)//移动
{
if(!legal(s[i],a,b))//判断是否合法
{
printf("This puzzle has no final configuration.\n");//否则
return;
}
}
for(int i=0;i<5;++i)//输出!
{
for(int j=0;j<4;++j)
{
printf("%c ",x[i][j]);
}
printf("%c\n",x[i][4]);
}
}
int main()
{
//freopen("shuju.txt","r",stdin);
dt['A'-'A']=0;dt['B'-'A']=1;dt['L'-'A']=2;dt['R'-'A']=3;
while(gets(x[0]))
{
if(x[0][0]=='Z')//结束判断
{
return 0;
}
for(int i=1;i<5;++i)
{
gets(x[i]);
}
int cnt=0,tp;
while((tp=getchar())!='0')//指令数组
{
if(tp!='\n')
{
s[cnt++]=tp;
}
}
s[cnt]='0';
getchar();//读取最后的换行
if(t)
{
printf("\n");//格式
}
printf("Puzzle #%d:\n",++t);
slove();
}
return 0;
}