UVA 1601 The Morning after Halloween - Japan 2007

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x[4],y[4],index;
}f[5000000];
struct node2{
	int x,y;
}tar[4];
int k,head,tail,n,m,a[17][17],b[17][17],c[17][17][5],mp[17][17][17][17][17][17];
int q[10]={0,0,-1,0,1},p[10]={0,1,0,-1,0};
int bfs(){
	int ax,ay,bx,by,cx,cy;
	int nax,nay,nbx,nby,ncx,ncy;
	head=0;
	tail=1;
	do{
		head++;
		ax=f[head].x[1];
		ay=f[head].y[1];
		bx=f[head].x[2];
		by=f[head].y[2];
		cx=f[head].x[3];
		cy=f[head].y[3];
		if(head==1)mp[ax][ay][bx][by][cx][cy]=1;
		for(int i=0;i<=b[ax][ay];i++)
			for(int j=0;j<=b[bx][by];j++)
				for(int t=0;t<=b[cx][cy];t++){
					nax=ax+q[c[ax][ay][i]];
					nay=ay+p[c[ax][ay][i]];
					nbx=bx+q[c[bx][by][j]];
					nby=by+p[c[bx][by][j]];
					ncx=cx+q[c[cx][cy][t]];
					ncy=cy+p[c[cx][cy][t]];
					if(k>1)
						if((nax==nbx&&nay==nby)||(nax==ncx&&nay==ncy)||(nbx==ncx&&nby==ncy))continue;
					if(nax==bx&&nay==by&&nbx==ax&&nby==ay)continue;
					if(nax==cx&&nay==cy&&ncx==ax&&ncy==ay)continue;
					if(k>1)
						if(nbx==cx&&nby==cy&&ncx==bx&&ncy==by)continue;
					if(mp[nax][nay][nbx][nby][ncx][ncy])continue;
					mp[nax][nay][nbx][nby][ncx][ncy]=1;
					f[++tail].x[1]=nax;
					f[tail].y[1]=nay;
					f[tail].x[2]=nbx;
					f[tail].y[2]=nby;
					f[tail].x[3]=ncx;
					f[tail].y[3]=ncy;
					f[tail].index=f[head].index+1;
					if(nax==tar[1].x&&nay==tar[1].y&&nbx==tar[2].x&&nby==tar[2].y&&ncx==tar[3].x&&ncy==tar[3].y)return f[tail].index;
				}
	}while(head<tail);
	return -1;
}
int main(){
	int m,n,i,j,t,l=0;
	while(scanf("%d%d%d",&m,&n,&k)){
		if(m==0&&n==0&&k==0)break;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		memset(mp,0,sizeof(mp));
		memset(tar,0,sizeof(tar));
		for(i=1;i<=n;i++){
			scanf("\n");
			for(j=1;j<=m;j++){
				scanf("%c",&a[i][j]);
				if(a[i][j]>='A'&&a[i][j]<='Z'){
					tar[a[i][j]-'A'+1].x=i;
					tar[a[i][j]-'A'+1].y=j;
				}
			}
		}
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++){
				if(a[i][j]!='#')
					for(t=1;t<=4;t++)
						if(a[i+q[t]][j+p[t]]!='#')
							c[i][j][++b[i][j]]=t;
				if(a[i][j]>='a'&&a[i][j]<='z'){
					f[1].x[a[i][j]-'a'+1]=i;
					f[1].y[a[i][j]-'a'+1]=j;
				}
			}
		if(k<2){f[1].x[2]=0;f[1].y[2]=0;tar[2].x=0;tar[2].y=0;}
		if(k<3){f[1].x[3]=0;f[1].y[3]=0;tar[3].x=0;tar[3].y=0;}
		f[1].index=0;
		printf("%d\n",bfs());
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值