你玩过华容道的游戏吗? 这是个类似的,但更简单的游戏。 看下面 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; }