HDU 1010 深搜+奇偶剪枝

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010

贴个资料:

http://acm.hdu.edu.cn/forum/read.php?tid=6158

奇偶剪枝:

对于从起始点 s 到达终点 e,走且只走 t 步的可达性问题的一种剪枝策略。

如下列矩阵 :

从任意 0 到达 任意 0,所需步数均为偶数,到达任意 1 ,均为奇数。反之亦然

所以有,若s走且只走 t 步可到达e,则必有t >= abs(s.x - e.x) + abs(s.y - e.y),且 (t&1) == ((abs(s.x - e.x) + abs(s.y - e.y))&1)。

否则必不可达。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 using namespace std;
 4 char maze[10][10];
 5 int dx[4] = { -1, 1, 0, 0 };
 6 int dy[4] = { 0, 0, -1, 1 };
 7 int sx, sy, ex, ey;
 8 bool escape;
 9 void dfs(int t, int x, int y)
10 {
11     if (maze[x][y] == ‘D‘&&t == 0 || escape)
12     {
13         escape = true; return;
14     }
15     char tmp = maze[x][y];
16     maze[x][y] = ‘X‘;
17     int T = t - abs(ex - x) - abs(ey - y);
18     if (T >= 0 && T % 2 == 0)
19     {
20         for (int i = 0; i < 4; i++)
21         {
22             int r = dx[i] + x, c = dy[i] + y;
23             if (maze[r][c] == ‘.‘ || maze[r][c] == ‘D‘)
24                 dfs(t - 1, r, c);
25         }
26     }
27     maze[x][y] = tmp;
28 }
29 int main()
30 {
31     int n, m, t;
32     while (scanf("%d%d%d", &n, &m, &t) && n)
33     {
34         for (int i = 1; i <= n; i++)
35             scanf("%s", maze[i]+1);
36         for (int i = 1; i <= n; i++)
37         {
38             for (int j = 1; j <= m; j++)
39             {
40                 if (maze[i][j] == ‘S‘)
41                     sx = i, sy = j;
42                 if (maze[i][j] == ‘D‘)
43                     ex = i, ey = j;
44             }
45         }
46         escape = false;
47         dfs(t, sx, sy);
48         printf(escape ? "YES\n" : "NO\n");
49     }
50     return 0;
51 }
时间: 2024-08-25 17:23:27

HDU 1010 深搜+奇偶剪枝的相关文章

hdu 1010 深搜+剪枝

深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> #include<math.h> using namespace std; char map[10][10]; int N,M,T; int di,dj,escape; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; void dfs(int x,int y,

HDU--1010 Tempter of the Bone(深搜+奇偶剪枝)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 我认为的剪枝就是在本来的代码中加入一些附加条件使之不去进行多余的计算,防止超时 奇偶剪枝的知识链接 AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int n,m,t,k,flag,starex,starey,endx,endy

HDU 1010 深搜+减枝

HDU 1010 /************************************************************************* > File Name: HDU1010.cpp > Author:yuan > Mail: > Created Time: 2014年11月05日 星期三 22时22分56秒 **********************************************************************

【深搜加剪枝五】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

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

回溯深搜与剪枝初步

回溯算法也称试探法,一种系统的搜索问题的解的方法,是暴力搜寻法中的一种.回溯算法的基本思想是:从一条路往前走,能进则进.回溯算法解决问题的一般步骤: 根据问题定义一个解空间,它包含问题的解 利用适于搜索的方法组织解空间 利用深度优先法搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索 回溯法采用试错的思想,它尝试分步的去解决一个问题.在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的

hdu 1258(深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1258 Sum It Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4012    Accepted Submission(s): 2066 Problem Description Given a specified total t

深搜优化剪枝

之前做过不少深搜题,很多TLE,所以剪枝很重要,如何“未雨绸缪”,避免不必要的搜索树分支? 例题: 数的划分 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5: 1,5,1: 5,1,1: 问有多少种不同的分法. 输出一个整数,即不同的分法. 由题意得,其分发出现重复数字组合则为同一种算法,那么保证1-k个数递增即可 代码: #include<bits/stdc++.h> using namespace std;

一本通例题埃及分数—题解&amp;&amp;深搜的剪枝技巧总结

一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化过程就像将搜索树上没用的枝条剪下来,因此搜索的优化过程又叫剪枝.剪枝的实质就是通过判断决定是否要沿当前枝条走下去. 二.搜索的剪枝必需遵循三个原则: 1.正确性(不能把正解排除,要不然搜什么呢?)2.准确性(尽可能把不能通向正解的枝条剪去)3.高效性(因为在每个枝条上都要进行一次判断,如果判断的复杂