Salvation nyoj 1129

//DFS,注意死循环的情况 
 //http://acm.nyist.net/JudgeOnline/problem.php?pid=1129
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,temp;
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};// 
int vis[102][102];
char map[102][102],d;

int check(int x,int y){
	if(x>=n||y>=m||x<0||y<0)return 0;
//	if(vis[x][y]==1)return 0;
	if(map[x][y]=='#')return 0;
	return 1;
}

int dfs(int x,int y,int d){
//	cout<<x<<' '<<y<<' '<<d<<endl;
	if(map[x][y]=='X'){
		return 1;
	}
	for(int i=d,t=0;t<4;t++,i++){
		int ds=(i+7)%4;//改变方向 
		int nx=x+dx[i%4],ny=y+dy[i%4];
		if(check(nx,ny)){
			if(vis[nx][ny]==4){//vis[nx][ny]==1&&(ds==temp)不对,可能重复走,但是方向和原来不一样 
				return 0;//但是走第五遍的时候,一定是重复的,和之前四次之一重复,但不一定是原始方向 
			}
			else{
				vis[nx][ny]++;
			   	if(dfs(nx,ny,ds)){
				   	return 1;
			   	}
			    return 0;
			}
		}
	}
	return 0;
}

int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		getchar();
    	int a,b;
    	memset(vis,0,sizeof(vis));
    	for(int i=0;i<n;i++){
	    	for(int j=0;j<m;j++){
		       scanf("%c",&map[i][j]);	
		       if(map[i][j]=='T'){
		        	a=i,b=j;
		       }
	    	}
	     	getchar();
    	}
	    scanf("%c",&d);
	    if(d=='N'){
	    	temp=0;
	    }
	    else if(d=='E'){
	    	temp=1;
	    }
	    else if(d=='S'){
	    	temp=2;
	    }
	    else{
	    	temp=3;
	    }
    	if(dfs(a,b,temp)){
    		printf("YES\n");
    	}
    	else{
	    	printf("NO\n");
    	}
	}
	return 0;
}
/*
4 4
....
.##.
.#X.
T...
N
4 4
....
.##.
.###
T#.X
N
4 4
....
....
.###
TX..
N

NO
NO
YES
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值