你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
+---+---+---+
| A | * | * |
+---+---+---+
| B | | * |
+---+---+---+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式:
输入两行6个字符表示当前的局面
输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
例如,输入:
* A
**B
程序应该输出:
17
再例如,输入:
A B
***
程序应该输出:
12
这题用广搜,要注意的是剪枝,也就是每次用过某种状态去移动之后都放入一个标记数组,每次要去移动的时候都判断一下上次是否用过这种状态。
下面上代码:
#include<stdio.h>
#include<string.h>
char a[2][4];
char ss[1000][4];
typedef struct node{
int step;
int ax,ay;
int bx,by;
int ex,ey;
char a[2][4];
}Queue;
int reok(char arr[][4],int slen) //剪枝
{
int i,j,cnt=0,xx=0;
for(i=1;i<slen;i++)
{
for(j=0;j<3;j++)
{
if(ss[i][j]==arr[xx][j])
cnt++;
}
xx++;
if(i%2==0)
{
if(cnt==6)
{
return 1;
}
cnt=0;
xx=0;
}
}
return 0;
}
void bfs(int ax,int ay,int bx,int by,int ex,int ey)
{
Queue q[10000];
int h=-1,p=0,len=0;
int slen=1;
q[p].ax=ax;
q[p].ay=ay;
q[p].bx=bx;
q[p].by=by;
q[p].ex=ex;
q[p].ey=ey;
q[p].step=0;
strcpy(*(q[p].a),*(a));
strcpy(*(q[p].a+1),*(a+1));
h++,p++,len++;
while(len!=0)
{
int aax=q[h].ax,aay=q[h].ay;
int bbx=q[h].bx,bby=q[h].by;
int eex=q[h].ex,eey=q[h].ey;
int step=q[h].step;
strcpy(*(a),*(q[h].a));
strcpy(*(a+1),*(q[h].a+1));
h++,len--;
if(aax==bx&&aay==by&&bbx==ax&&bby==ay)
{
printf("%d\n",step-1);
return ;
}
else
{
if(reok(a,slen))
{
continue;
}
char mida[2][4];
char temp;
if((eex-1)>=0)//上
{
strcpy(*(mida),*(a));
strcpy(*(mida+1),*(a+1));
if(mida[eex-1][eey]=='A')
{
aax=eex-1;
aay=eey;
}
if(mida[eex-1][eey]=='B')
{
bbx=eex-1;
bby=eey;
}
q[p].ax=aax;q[p].ay=aay;
q[p].bx=bbx;q[p].by=bby;
q[p].ex=eex-1;q[p].ey=eey;
q[p].step=step+1;
temp=mida[eex-1][eey];mida[eex-1][eey]=mida[eex][eey];mida[eex][eey]=temp;
strcpy(*(q[p].a),*(mida));
strcpy(*(q[p].a+1),*(mida+1));
len++,p++;
}
if((eex+1)<=1)//下
{
strcpy(*(mida),*(a));
strcpy(*(mida+1),*(a+1));
if(mida[eex+1][eey]=='A')
{
aax=eex+1;
aay=eey;
}
if(mida[eex+1][eey]=='B')
{
bbx=eex+1;
bby=eey;
}
q[p].ax=aax;q[p].ay=aay;
q[p].bx=bbx;q[p].by=bby;
q[p].ex=eex+1;q[p].ey=eey;
q[p].step=step+1;
temp=mida[eex+1][eey];mida[eex+1][eey]=mida[eex][eey];mida[eex][eey]=temp;
strcpy(*(q[p].a),*(mida));
strcpy(*(q[p].a+1),*(mida+1));
len++,p++;
}
if((eey-1)>=0) //左
{
strcpy(*(mida),*(a));
strcpy(*(mida+1),*(a+1));
if(mida[eex][eey-1]=='A')
{
aax=eex;
aay=eey-1;
}
if(mida[eex][eey-1]=='B')
{
bbx=eex;
bby=eey-1;
}
q[p].ax=aax;q[p].ay=aay;
q[p].bx=bbx;q[p].by=bby;
q[p].ex=eex;q[p].ey=eey-1;
q[p].step=step+1;
temp=mida[eex][eey-1];mida[eex][eey-1]=mida[eex][eey];mida[eex][eey]=temp;
strcpy(*(q[p].a),*(mida));
strcpy(*(q[p].a+1),*(mida+1));
len++,p++;
}
if((eey+1)<=2)//右
{
strcpy(*(mida),*(a));
strcpy(*(mida+1),*(a+1));
if(mida[eex][eey+1]=='A')
{
aax=eex;
aay=eey+1;
}
if(mida[eex][eey+1]=='B')
{
bbx=eex;
bby=eey+1;
}
q[p].ax=aax;q[p].ay=aay;
q[p].bx=bbx;q[p].by=bby;
q[p].ex=eex;q[p].ey=eey+1;
q[p].step=step+1;
temp=mida[eex][eey+1];mida[eex][eey+1]=mida[eex][eey];mida[eex][eey]=temp;
strcpy(*(q[p].a),*(mida));
strcpy(*(q[p].a+1),*(mida+1));
len++,p++;
}
strcpy(*(ss+slen),*(a+0));slen++;
strcpy(*(ss+slen),*(a+1));slen++;
}
}
}
int main()
{
int Ax,Ay,Bx,By,ex,ey;
int i,j;
for(i=0;i<2;i++)
{
gets(*(a+i));
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
if(a[i][j]=='A')
{
Ax=i;
Ay=j;
}
if(a[i][j]=='B')
{
Bx=i;
By=j;
}
if(a[i][j]==' ')
{
ex=i;
ey=j;
}
}
}
bfs(Ax,Ay,Bx,By,ex,ey);
return 0;
}