题目: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 }

转载于:https://www.cnblogs.com/-Unc/p/4134890.html

HDU 1010 深搜+奇偶剪枝相关推荐

  1. hdu1010深搜+奇偶剪枝

    奇偶剪枝:把map看作 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1   从 0->1 需要奇数步 从 1->0 ...

  2. Black And White HDU - 5113 深搜dfs+剪枝

    原题 Problem Description In mathematics, the four color theorem, or the four color map theorem, states ...

  3. 斗地主(深搜+贪心+剪枝)

    斗地主 题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=4325 solution 由于牌数不是很多,n<=23,一开始想到用状态压缩的方 ...

  4. hdu 1312深搜入门题

    2019独角兽企业重金招聘Python工程师标准>>> Red and Black Problem Description There is a rectangular room, ...

  5. 再探深搜之剪枝、迭代加深及双向搜索

    一.剪枝 剪枝的基本方法: 1.优化搜索顺序 2.排除等效冗余 3.可行性剪枝(上下界剪枝) 4.最优性剪枝 例题1:AcWing 167.木棒 这题首先很容易想出暴力的代码:从小到大枚举木棍总长度的 ...

  6. 2412 - 和为K ---深搜dfs剪枝

    **2412 - 和为K ---深搜dfs优化 **来源:东方博宜oj oj.czos.cn #include<bits/stdc++.h> using namespace std; co ...

  7. 搜索 —— 深搜的剪枝技巧

    [概述] 搜索算法的时间复杂度大多是指数级的,难以满足对程序运行时间的限制要求,为使降低时间复杂度,对深度优先搜索可以进行一种优化的基本方法--剪枝. 搜索的进程可以看做是从树根出发,遍历一颗倒置树( ...

  8. HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)

    需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...

  9. hdu 3812 Sea Sky 深搜+剪枝

    题目意思: 从sea 找一条道sky 的最长路 题解: 先进行一系列的预处理 1.将所有不重复的字符串先保留下来,然后从小到大排序,这样深搜的时候最先弄出来的答案就是最小的 字母序. 2. 进行深度优 ...

最新文章

  1. Spark MLlib实现的中文文本分类–Naive Bayes
  2. 安装虚拟机Ubuntu,搭建lnmp环境碰到的坑(二)
  3. java float 四舍五入_JAVA如何把一个float四舍五入到小数点后指定位数.
  4. Linux配置免密登录
  5. windows下如何github ssh 公钥
  6. 设计一个笔记本电脑类,属性随意,并且进行属性私有化,对外提供公开的set和get方法。 设计一个可插拔的接口:InsertDrawable,该接口有什么方法自行定义。
  7. python怎样算学的好_python怎么学习好
  8. IIS服务器应用程序不可用的解决办法
  9. java web应用程序_说说Java Web中的Web应用程序|乐字节
  10. MATLAB语言初步学习(五)
  11. TCP 拥塞控制算法
  12. MacBook上Wi-Fi抓包权限
  13. linux下快速查找文件
  14. 探秘BOF 和EOF
  15. 推荐《我是谁 – 没有绝对安全的系统》CLAY——Clown Laughing At You「小丑的嘲笑」
  16. 阿里云云服务器无法通过公网ip地址访问网站的解决方法
  17. 动态规划---买卖股票的最佳时机
  18. 5GNR漫谈9:PDSCH和PUSCH资源映射(频域type0/type1和时域typeA/typeB/typeC)
  19. 栽培员工,让他强大到可以离开!
  20. SpringCloud微服务搭建(四 搭建EurekaServer集群)

热门文章

  1. asp.net 下拉框绑定值
  2. 人教版三年级下册计算机课教案,人教版三年级下册19课教案
  3. Windows系统的32位和64位系统区别
  4. 【2020团体程序设计天梯赛】L2部分(PTA,L2-033到L2-036)题解代码复盘
  5. 【NOIP2008】【Vijos1493】传纸条
  6. python2中的print语句可以不用小括号。_Python 2.7终结于7个月后,这是你需要了解的3.X炫酷新特性...
  7. html 内容不被父级包住,解决:父级元素不能被子元素内容撑开的解决办法,父级元素没有高度的解决办法...
  8. LeetCode解题思路—区间合并
  9. docker 容器和镜像的区别
  10. 递归法:整数划分问题(怎么进行划分呢)