图论基础UVA10047

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=30;
struct node{
	int x,y,c,dr,s;
};
char str[maxn];
bool p[maxn][maxn][5][4],a[maxn][maxn];
struct node q[maxn*maxn*4*5];
void din(int i,int x1,int y1,int c1,int dr1,int s1){
	q[i].x=x1;q[i].y=y1;q[i].s=s1;q[i].c=c1;q[i].dr=dr1;	
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("uva10047.in","r",stdin);
	freopen("uva10047.out","w",stdout);
#endif
	int i,j,k,k1,m,n;
	int xs,ys,xt,yt,e,T=0;
	int f,l,u,v,w;	
	while(1){
		T++;		
		memset(p,0,sizeof(p));
		memset(a,0,sizeof(a));		
		scanf("%d%d",&n,&m);
		if(n*m==0)break;				
		if(T>1)puts("");
		getchar();
		for(i=1;i<=n;i++){
			gets(str);
			for(j=0;j<m;j++){
				if(str[j]!='#')
					a[i][j+1]=1;
				if(str[j]=='S'){
					xs=i;ys=j+1;					
				}
				if(str[j]=='T'){					
					xt=i;yt=j+1;
				}
			}		
		}		
		f=0;l=1;
		din(1,xs,ys,0,0,0);
		p[xs][ys][0][0]=1;
		int flag=0,ans;
		int col,dre;
		while(f<l){
			f++;
			u=q[f].x;v=q[f].y;w=q[f].s;col=q[f].c;dre=q[f].dr;
			if(!p[u][v][col][(dre+1)%4]){
				din(++l,u,v,col,(dre+1)%4,w+1);
				p[u][v][col][(dre+1)%4]=1;
			}
			if(!p[u][v][col][(dre+3)%4]){
				din(++l,u,v,col,(dre+3)%4,w+1);
				p[u][v][col][(dre+3)%4]=1;
			}
			if(dre==0 && a[u-1][v] && !p[u-1][v][(col+1)%5][dre]){
				din(++l,u-1,v,(col+1)%5,dre,w+1);
				p[u-1][v][(col+1)%5][dre]=1;
				if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
			}
			if(dre==1 && a[u][v+1] && !p[u][v+1][(col+1)%5][dre]){
				din(++l,u,v+1,(col+1)%5,dre,w+1);
				p[u][v+1][(col+1)%5][dre]=1;
				if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
			}
			if(dre==2 && a[u+1][v] && !p[u+1][v][(col+1)%5][dre]){
				din(++l,u+1,v,(col+1)%5,dre,w+1);
				p[u+1][v][(col+1)%5][dre]=1;
				if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
			}
			if(dre==3 && a[u][v-1] && !p[u][v-1][(col+1)%5][dre]){
				din(++l,u,v-1,(col+1)%5,dre,w+1);
				p[u][v-1][(col+1)%5][dre]=1;
				if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
			}
		}
		if(!flag)
			printf("Case #%d\ndestination not reachable\n",T);
		else
			printf("Case #%d\nminimum time = %d sec\n",T,ans);		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值