直接做的,没想到什么好技巧,做的比较啰嗦。。。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
char square[5][5];
char s[100];
char a;//临时的字符
int num;//计数
int n=1;//经过了几次
while(1) //一开始的东西
{
int blank_i;
int blank_j;
for (int i = 0; i < 5; ++i)
{
memset(square[i],0,sizeof(square[i]));
num=0;
while((a=getchar())!='\n')
{
if(a=='Z')
return 0;
else if(a==' ')
{
blank_i=i;
blank_j=num;
}
square[i][num++]=a;
}
}
memset(s,0,sizeof(s));//输入命令
num=0;
while(cin>>a && a!='0')
s[num++]=a;
bool flag=true;
for (int i = 0; i < (int)strlen(s); ++i)
{
if(s[i]=='A')//与上面的进行交换
{
if(blank_i==0)
{
flag=false;
break;
}
square[blank_i][blank_j]=square[blank_i-1][blank_j];
blank_i=blank_i - 1;
square[blank_i][blank_j]=' ';
}
else if(s[i]=='B')//与下面的进行交换
{
if(blank_i==4)
{
flag=false;
break;
}
square[blank_i][blank_j]=square[blank_i+1][blank_j];
blank_i=blank_i + 1;
square[blank_i][blank_j]=' ';
}
else if(s[i]=='L')//与左面的进行交换
{
if(blank_j==0)
{
flag=false;
break;
}
square[blank_i][blank_j]=square[blank_i][blank_j-1];
blank_j=blank_j - 1;
square[blank_i][blank_j]=' ';
}
else if(s[i]=='R')//与右面的进行交换
{
if(blank_j==4)
{
flag=false;
break;
}
square[blank_i][blank_j]=square[blank_i][blank_j+1];
blank_j=blank_j + 1;
square[blank_i][blank_j]=' ';
}
}
if(n>1)
cout<<endl;
printf("Puzzle #%d:\n",n++);
if(flag==false)
printf("This puzzle has no final configuration.\n");
else
{
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j)
{
cout<<square[i][j];
if(j<=3)
cout<<" ";
if(j==4)
cout<<"\n";
}
}
getchar();
}
return 0;
}