HDU 1010 Tempter of the Bone 骨头诱惑(AC代码)DFS搜索+剪枝法

参考了别人的思路:将迷宫外围四面都筑墙‘X’。方便减少代码量。

 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <math.h>
 5 using namespace std;
 6 vector<string> v;
 7 int n,m;
 8 int x_1,y_1,x_2,y_2;
 9 bool maze(int x,int y,int t)    //目前走到第n行m列的位置
10 {
11     if(t==1)    //若t小于0,则检查四个方向是否有门D
12     {
13         if(x_2==x && (y_2==y-1||y_2==y+1))
14             return true;
15         if(y_2==y && (x_2==x-1||x_2==x+1))
16             return true;
17     }
18     else    //若不为0,调用4次此函数,分别是四个方向,若该方向不能走,则不调用
19     {
20         t--;
21         v[x][y]=‘0‘;    //封掉该格子
22         if(v[x-1][y]==‘.‘ && maze(x-1,y,t)==true )
23             return true;
24         if(v[x+1][y]==‘.‘ && maze(x+1,y,t)==true )
25             return true;
26         if(v[x][y-1]==‘.‘ && maze(x,y-1,t)==true )
27             return true;
28         if(v[x][y+1]==‘.‘ && maze(x,y+1,t)==true )
29             return true;
30     }
31     v[x][y]=‘.‘;    //开放该格子
32     return false;
33 }
34 int main()
35 {
36     int t,i,j;    //x为行,y为列。
37     string temp="",tem="XXXXXXXX";
38     while(scanf("%d %d %d",&n,&m,&t)&&n!=0)
39     {
40         v.push_back(tem);
41         for(i=0;i<n;i++)
42         {
43             cin>>temp;
44             temp=‘X‘+temp;
45             temp+=‘X‘;    //围起来
46             v.push_back(temp);
47             if(temp.find(‘S‘)!=-1)
48             {
49                 x_1=i+1;y_1=temp.find(‘S‘);
50             }
51             if(temp.find(‘D‘)!=-1)
52             {
53                 x_2=i+1;y_2=temp.find(‘D‘);
54             }
55         }
56         v.push_back(tem);
57
58         if(    abs(y_2-y_1)+abs(x_2-x_1)>t)
59             printf("NO\n");
60         else if( (abs(y_2-y_1)+abs(x_2-x_1))%2!=t%2 )
61             printf("NO\n");
62         else if(maze(x_1,y_1,t)==true)
63             printf("YES\n");
64         else
65             printf("NO\n");
66         v.clear();
67     }
68     return 0;
69 }

1010

题意:必须在第t秒走到格子D上,S为起点,D为终点,点就是可以走,X就是墙。

思路:深度搜索+奇偶剪枝,再加一个剪枝“无法在指定时间内到达”。

直译:

小狗在一个古老的迷宫里发现一根骨头,迷宫让它很惊讶。但是,当他拿起骨头,迷宫开始振动,而小狗能够感觉到地面在下沉。
它意识到骨头是个陷阱,他准备分身一试逃出迷宫。
迷宫是个矩形,其大小是N*M,有个门在迷宫里。在一开始,门是关的,它将会在第T秒开一小段时间(小于1秒)。
因此,小狗必须在刚好T秒时到达门的旁边。每一秒,小狗能够移动一步到当前块块的上、下、左、右的块。
一旦它进入一个块,这块的地面将开始下沉并消失在下一秒(即每个位置只能走一次)。它不能够呆在一个块上超过1秒,也不能进入一个已走过过的块。
这只小狗能活下去吗?请帮助他。

输入:第一行包括3个整数N、M、T,分别代表迷宫的大小、迷宫门会开的时刻。
接下来N行是迷宫的布局,每行包括M个字符,只能是以下四种之一:
X:一面墙,不能进入
S:狗的起点
D:迷宫门
.:一个空块。

1<N
M<7
0 < T < 50

时间: 2024-10-17 05:37:02

HDU 1010 Tempter of the Bone 骨头诱惑(AC代码)DFS搜索+剪枝法的相关文章

【深搜加剪枝五】HDU 1010 Tempter of the Bone

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

HDU 1010 Tempter of the Bone heuristic 剪枝法

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

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): 68206    Accepted Submission(s): 18719 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

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): 70665    Accepted Submission(s): 19487 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

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): 125945    Accepted Submission(s): 33969 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU - 1010 Tempter of the Bone 深搜模板题(DPS)解题报告

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

HDU 1010 Tempter of the Bone(bfs)

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

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): 75141    Accepted Submission(s): 20531 Problem Description The doggie found a bone in an ancient maze, which fascinated him a