HDU1010 --- Tempter of the Bone(dfs+剪枝)

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

Input

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

输入以 3 个 0 结束。这个测试用例不需要处理。

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

代码:
import java.util.Arrays;
import java.util.Scanner;

public class Main{
        static int n,m,T;
        static final int N=10;
        static int sx,sy,ex,ey;
        static int dx[]={0,0,1,-1};
        static int dy[]={1,-1,0,0};
        static char map[][]=new char[N][N];
        static boolean vis[][]=new boolean[N][N];
        static boolean flag;

        static void dfs(int x,int y,int t){          //这种多if判断的一定加上return
                if(flag) return; //已经找到一种走法
                if(t>T)  return; //大于要求的时间
                if(T-t-Math.abs(x-ex)-Math.abs(y-ey)<0) return; //剩余的步数不足以到达终点
                if((T-t)%2!=(Math.abs(x-ex)+Math.abs(y-ey))%2) return; //奇偶性一致
                if(t==T && x==ex && y==ey){
                         flag=true;
                }

                for(int i=0;i<4;i++){
                        int xx=x+dx[i];
                        int yy=y+dy[i];
                        if(xx<0 || yy<0 || xx>=n || yy>=m ||vis[xx][yy]) continue;
                        vis[xx][yy]=true;
                        dfs(xx,yy,t+1);
                        vis[xx][yy]=false;
                }
        }
        public static void main(String[] args) {
                Scanner scan=new Scanner(System.in);
                while(scan.hasNext()){
                        n=scan.nextInt();
                        m=scan.nextInt();
                        T=scan.nextInt();
                        if(n==0 && m==0 &&T==0) break;
                        for(int i=0;i<n;i++) map[i]=scan.next().toCharArray();
                        for(int i=0;i<N;i++)  Arrays.fill(vis[i],false);
                        for(int i=0;i<n;i++)
                            for(int j=0;j<m;j++)
                                if(map[i][j]==‘S‘){
                                        sx=i; sy=j;
                                }
                                else if(map[i][j]==‘D‘){
                                        ex=i; ey=j;
                                }
                                else if(map[i][j]==‘X‘)
                                        vis[i][j]=true;
                        vis[sx][sy]=true;
                        flag=false;
                        dfs(sx,sy,0);
                        if(flag) System.out.println("YES");
                        else System.out.println("NO");
                }
        }
}

原文地址:https://www.cnblogs.com/qdu-lkc/p/12238816.html

时间: 2024-09-27 16:13:51

HDU1010 --- Tempter of the Bone(dfs+剪枝)的相关文章

hdu1010 Tempter of the Bone(DFS+剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 90716    Accepted Submission(s): 24683 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU1010 Tempter of the Bone(DFS+剪枝)

1 # include <stdio.h> 2 #include <cstdio> 3 #include <iostream> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 char map[8][8]; 8 int visit[8][8]; 9 struct node{ 10 int x,y; 11 }; 12 int n,m; 13 node Save,Dog

HDU 1010 Tempter of the Bone dfs+剪枝

给你一个迷宫一个起点和一个终点,问你能否走T步刚好到达终点,不能重复走,并且只有4个方向 显然这是一个dfs,虽然N最大只有7,但是裸的dfs复杂度还是太高了,因此要进行一些剪枝 1.如果T比图上所有的可走点还要大,肯定是不可行的.这个可以避免dfs整张图. 2.奇偶剪枝,有性质当前点(x,y)到目标点(tx,ty)的所有路径的长度的奇偶性一定和|x-tx|+|y-ty|一样. #include <cstdio> #include <iostream> #include <c

HDU 1010 Tempter of the Bone(DFS剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 129289    Accepted Submission(s): 34906 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

B - Tempter of the Bone(DFS+剪枝)

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of

HDU_(1010) Tempter of the Bone(DFS,剪枝)

题目请点我 题意: 有一个迷宫,看能不能经过T秒恰好从起点走到终点.因为可能会考虑到绕路,2^49可能会超时(况且涉及到绕路,墙的数目一定不会很多),我们就可以在每次都进行一次判断,看剩下的时间能否走到终点.另外因为只能在T秒走到,那么绕路的话一定会多走偶数步数,利用这个性质也可以剪枝.这道题其实之前做过的,但是第二次做还是TLE了很多次,其实这题的关键不仅是dfs,在T秒恰好到达需要绕路才是这道题的亮点,trap也在这里. 代码: #include <iostream> #include &

HDU1010 Tempter of the Bone(回溯 + 剪枝)

题意: 输入一个 N * M的迷宫,这个迷宫里'S'代表小狗的位置,'X'代表陷阱,‘D’代表门,‘.’代表可行走的地方,小狗每次可以选择往周围的四个方向行走,问这个小狗能否正好T步找到门. 思路: 利用回溯 + 剪枝,这道题剪枝特别重要. 剪枝一: 可以把图看成这样: 1 0 1 0 10 1 0 1 01 0 1 0 10 1 0 1 01 0 1 0 1 则假设从点 a(i + j,横纵坐标之和) 走到点 b(i + j) ,如果 a 和 b 的奇偶性相同,那么从 a 到 b 必须是偶数步

HDU1010 Tempter of the Bone 【DFS】+【剪枝】

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 70895    Accepted Submission(s): 19535 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU1010 Tempter of the Bone(小狗是否能逃生----DFS)

Tempter of the Bone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggi

HDU 1010 Tempter of the Bone heuristic 剪枝法

本题就是考剪枝法了. 应该说是比较高级的应用了.因为要使用heuristic(经验)剪枝法.要总结出这个经验规律来,不容易.我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢,仅仅能过掉,由此看来很多人没有做好这道题. 这里我需要更正一下网上流行的说法:奇偶剪枝法. 其实本题使用奇偶剪枝法并不能太大提高速度,只能说仅仅让使用奇偶剪枝过掉.所以网上说本题使用奇偶剪枝的,其实并不能提高速度. 原因: 奇偶剪枝只能剪枝一次,不能在递归的时候剪枝,因为只要初始化位置符合奇偶性,那