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

剪枝:1能走的地板数小于所给时间,肯定走不过。

2狗达到门的时间和所给时间同奇偶性。

奇偶剪枝:http://blog.csdn.net/chyshnu/article/details/6171758

可以把map看成这样:
n0 1 0 1 0 1
n1 0 1 0 1 0
n0 1 0 1 0 1
n1 0 1 0 1 0
n0 1 0 1 0 1
n从为 0 的格子走一步,必然走向为 1 的格子
n从为 1 的格子走一步,必然走向为 0 的格子
n即:
n 0 ->1或1->0 必然是奇数步

0->0 走1->1 必然是偶数步

这样我们在搜索的过程中,走一步进行一次判断,如果不符合上述条件 就可以直接舍弃。

ex和ey是目标坐标

int temp=(t-time)-abs(x-ex)-abs(y-ey);
    if(temp<0||temp&1) return 0;

temp&1 就是取二进制的最后一位,如果是奇数那就是1,偶数就是0;

行相减的绝对值加列想减的绝对值可以看出他们在map中的值是否相等,如果不等,必是奇数,如果相等就是偶数。。

而t-time就是剩余步数。。

最后想减得到temp 。。。

temp<0显然不能走了,而如果temp为奇数也就是说违背上述条件,也不能走。

 1 #include <iostream>
 2 #include <cstdio>
 3 char map[10][10];
 4 int N, M, T, t, starti, startj, doori, doorj;
 5 bool flag;
 6 int dir[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}};
 7 void dfs(int x, int y, int t)
 8 {
 9     if (x == doori && y == doorj && t == T)
10     {
11         flag = true;
12         return;
13     }
14     int temp = T - t - abs(x - doori) - abs(y - doorj);      //奇偶判断
15     if (temp < 0 || temp & 1)
16         return;
17     for (int i = 0; i < 4; ++i)
18     {
19         int fx = x + dir[i][0];
20         int fy = y + dir[i][1];
21         if (fx>=0 && fx<N && fy>=0 && fy<M && map[fx][fy] != 'X')
22         {
23             map[fx][fy] = 'X';
24             dfs(fx, fy, t + 1);
25             if (flag)
26                return;
27             map[fx][fy] = '.';                                  //回溯
28         }
29     }
30 }
31 int main()
32 {
33     while (scanf("%d %d %d", &N, &M, &T) != EOF && N)
34     {
35         int wallnum = 0;
36         flag = false;
37         for (int i = 0; i < N; ++i)
38             for (int j = 0; j < M; ++j)
39             {
40                 std::cin >> map[i][j];
41                 if (map[i][j] == 'S')
42                 {
43                     starti = i;
44                     startj = j;
45                 }
46                 else if (map[i][j] == 'D')
47                 {
48                     doori = i;
49                     doorj = j;
50                     ++wallnum;
51                 }
52                 else if (map[i][j] == '.')
53                     ++wallnum;
54             }
55         map[starti][startj] = 'X';
56         if (wallnum >= T)
57             dfs(starti, startj, 0);
58         if (flag)
59             printf("YES\n");
60         else
61             printf("NO\n");
62     }
63     system("pause");
64     return 0;
65 }

转载于:https://www.cnblogs.com/PegasusWang/archive/2013/04/05/3001078.html

hdu 1010 Tempter of the Bone(dfs+奇偶剪枝)相关推荐

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

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

  2. (step4.3.1) hdu 1010(Tempter of the Bone——DFS)

    题目大意:输入三个整数N,M,T.在接下来的N行.M列会有一系列的字符.其中S表示起点,D表示终点. .表示路 . X表示墙...问狗能有在T秒时到达D.如果能输出YES, 否则输出NO 解题思路:D ...

  3. HDU.1010 Tempter of the Bone

    文章目录 一.题目解读 1.原题 2.分类 3.题意 4.输入输出格式 5.数据范围 二.题解参考 1.总体思路 2.思路① (1).分析 (2).AC代码 三.评价与后话 1.评价 2.奇偶剪枝0- ...

  4. 回溯法+奇偶剪枝——Hdu 1010 Tempter of the Bone

    1)   题目 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述: 代码 ...

  6. HDU 1010 Tempter of the Bone heuristic 修剪

    的问题是,在测试修剪. 应该说是更先进的应用. 由于使用的heuristic(经验)修剪.总结这方面的经验法则,别easy.我说,这也是由于先进的在线报告中的应用程序没有分析太多太好的解决这个问题,计 ...

  7. HDU 1010 Tempter of the Bone heuristic 剪枝法

    本题就是考剪枝法了. 应该说是比较高级的应用了.因为要使用heuristic(经验)剪枝法.要总结出这个经验规律来,不容易.我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢, ...

  8. 输入空格hdu - 1010 - Tempter of the Bone

    时间紧张,先记一笔,后续优化与完善. 题意:一个N*M的地图,走过的点不能再走,X为墙弗成走,能否从点S到点D恰好用时T.(1 < N, M < 7; 0 < T < 50) ...

  9. Tempter of the Bone HDU - 1010(DFS + 奇偶剪枝)

    题目 这个题思路不难,就是不用奇偶剪枝的话会出现TLE,奇偶剪枝说白了就是一个矩阵分成两种区域,从一种区域走到另一个区域必是奇数步数,从一种区域走回自己的区域必是偶数步数,就算出现了障碍物这个结论依旧 ...

  10. Tempter of the Bone(DFS + 奇偶剪枝,好题)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

最新文章

  1. php-cgi.sock 权限,php-fpm sock文件权限设置
  2. 韵乐x5最佳参数手动_诺基亚X5、vivoZ1青春版、海信彩墨屏阅读手机A5C对比
  3. java配置文件中的plugin,启用ContextReplacementPlugin以忽略webpack中的配置和测试设置文件...
  4. graphical model
  5. STM32 map文件解析
  6. 史上最可怕最震撼的46亿年世界历史!看完我跪了....
  7. 【后台任务】将工作请求发送到后台服务(11)
  8. Redis持久化方式之RDB
  9. 从原理到实践,手把手带你轻松get数仓双集群容灾
  10. Android 面试 缓存,荐【经典面试题】七大缓存经典问题...
  11. 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
  12. 令牌环网 IEEE802.5
  13. 网易邮箱显示服务器返回错误,企业退信的常见问题?
  14. 微信小程序实现多图片下载
  15. NAT之SNAT和DNAT
  16. matlab从入门到精通(二)matlab语言基础
  17. 顾芊芊坐公车去了铭池学院
  18. 程序员真实从零开始实操 赚钱渠道之二 群控+极速版
  19. Flink教程(17)- Flink Table与SQL(案例与SQL算子)
  20. 2021-2027全球及中国电外科手术钳行业研究及十四五规划分析报告

热门文章

  1. 通知:小密圈暂停服务
  2. 你真的需要一个微信公众号吗?
  3. 解密朋友圈红包照片功能
  4. swing怎么监听其他类的按钮_Swing舞出我人生 Vol.05 / 我想通过跳舞去寻找自己
  5. 开源 - WPF报表引擎
  6. ARM中R0-R15寄存器的作用
  7. 快速从mysqldump文件中恢复一个表
  8. 字符串(AC自动机):COCI 2015 round 5 divljak
  9. DG - 开启Active Data Guard
  10. JS计算GridView里的TextBox