• Tempter of the Bone


    Tempter of the Bone

    小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里。
    经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t秒大门会为你敞开”,而他自己所在的棋盘是大小为
    N*M 的长方形,他可以向上下左右四个方向移动(不可走有障碍点)。棋盘中有一扇门。根据机关的提示,小明顿时明白了,他和朋友必须在第 t
    秒到门口。而这一切,没有回头路!因为一旦他移动了,他刚才所在的点就会消失,并且他不能在一个点上停留超过一秒,不然格子会爆炸。大逃亡开始了,请问小明和朋友能安全的逃出这奇怪的棋盘吗?

    Input
    输入多组测试数据。每个测试用例的第一行包含三个整数 N、M 和 T ( 1 < N , M < 7 ; 0 < T < 50 ),分别表示棋盘的大小和门打开的时间。接下来的N行给出棋盘布局,每一行包含M个字符。其中
    “.”: 无障碍点
    “X”: 障碍点
    “S”: 起点
    “D”: 门

    输入以 3 个 0 结束。这个测试用例不需要处理。
    输入数据中的空格有些问题,请不要使用getchar(),如果一定要用可以选择scanf("%s",) 自动忽略空格

    Output
    对于每组样例输出一行。
    如果小明能够安全逃出,输出 “YES” ,否则输出 “NO”。

    Sample Input
    4 4 5
    S.X.
    …X.
    …XD

    3 4 5
    S.X.
    …X.
    …D
    0 0 0
    Sample Output
    NO
    YES

    关键点:在第t秒到达门口,需要用到奇偶剪枝,不然会tle。

    奇偶剪枝:
    一个点坐标a(x,y),另一个点坐标b(dx,dy),从a->b需要步数k=abs(dx-x)+abs(dy-y)<=从a->b的 剩余步数。设剩余步数为step;则k和step的奇偶性相同。

    Code:

    #include<iostream>
    #include<cstring>
    #include<cmath>
    using namespace std;
    char a[10][10];
    int n,m,t,flag,ex,ey;
    int vis[10][10];
    int d[4][2]={0,1,0,-1,1,0,-1,0};
    bool check(int x,int y){
    	if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&a[x][y]!='X'){
    		return 1;
    	}
    	return 0;
    }
    void dfs(int x,int y,int step){
            if(flag) return ;
    	if(step==t){
    		if(a[x][y]=='D')
    			flag=1;
    		return ;
    	}
    	if(step>t) return ;
    	int k=abs(ex-x)+abs(ey-y);//最小步数
    	if((t-step)<k){//奇偶剪枝
    		return ;
    	} 
    	if((t-step-k)%2){
    		return ;
    	}
    	for(int i=0;i<4;i++){
    		int dx=x+d[i][0];
    		int dy=y+d[i][1];
    		if(check(dx,dy)){
    			vis[dx][dy]=1;
    			dfs(dx,dy,step+1);
    			vis[dx][dy]=0;
    		}
    	}
    }
    int main(){
    	while(cin>>n>>m>>t&&(n+m+t)){
    		memset(vis,0,sizeof(vis));
    		memset(a,0,sizeof(a));
    		flag=0;
    		for(int i=0;i<n;i++){
    			cin>>a[i];
    		}
    		int sx,sy;
    		for(int i=0;i<n;i++)
    			for(int j=0;j<m;j++){
    				if(a[i][j]=='D'){
    					ex=i,ey=j;
    				}
    				if(a[i][j]=='S'){
    					vis[i][j]=1;
    					sx=i,sy=j;
    				}
    			}
    		vis[sx][sy]=1;
    		dfs(sx,sy,0);
    		if(flag) cout<<"YES"<<endl;
    		else cout<<"NO"<<endl;
    	}
    	
    	return 0;
    }
    
    七月在野,八月在宇,九月在户,十月蟋蟀入我床下
  • 相关阅读:
    sqlserver中自定义函数+存储过程实现批量删除
    javascript的词法分析
    struts2 OGNL(Object-Graph Navigation Language) 井号,星号,百分号
    SimpleAdapter
    IntentService源码分析
    Service 的 onStartCommand(Intent, int, int) 返回值
    AppFog使用
    Looper分析。ThreadLocal有关
    HandlerThread分析
    form表单的enctype属性
  • 原文地址:https://www.cnblogs.com/voids5/p/12695049.html
Copyright © 2020-2023  润新知