蓝桥杯省赛——卡片换位

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


猜你喜欢

转载自blog.csdn.net/qq_41262903/article/details/79752989