hdu 1010 Tempter of the Bone(dfs+奇偶剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010
剪枝:1能走的地板数小于所给时间,肯定走不过。
2狗达到门的时间和所给时间同奇偶性。
奇偶剪枝:http://blog.csdn.net/chyshnu/article/details/6171758
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+奇偶剪枝)相关推荐
- HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)
需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...
- (step4.3.1) hdu 1010(Tempter of the Bone——DFS)
题目大意:输入三个整数N,M,T.在接下来的N行.M列会有一系列的字符.其中S表示起点,D表示终点. .表示路 . X表示墙...问狗能有在T秒时到达D.如果能输出YES, 否则输出NO 解题思路:D ...
- HDU.1010 Tempter of the Bone
文章目录 一.题目解读 1.原题 2.分类 3.题意 4.输入输出格式 5.数据范围 二.题解参考 1.总体思路 2.思路① (1).分析 (2).AC代码 三.评价与后话 1.评价 2.奇偶剪枝0- ...
- 回溯法+奇偶剪枝——Hdu 1010 Tempter of the Bone
1) 题目 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述: 代码 ...
- HDU 1010 Tempter of the Bone heuristic 修剪
的问题是,在测试修剪. 应该说是更先进的应用. 由于使用的heuristic(经验)修剪.总结这方面的经验法则,别easy.我说,这也是由于先进的在线报告中的应用程序没有分析太多太好的解决这个问题,计 ...
- HDU 1010 Tempter of the Bone heuristic 剪枝法
本题就是考剪枝法了. 应该说是比较高级的应用了.因为要使用heuristic(经验)剪枝法.要总结出这个经验规律来,不容易.我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢, ...
- 输入空格hdu - 1010 - Tempter of the Bone
时间紧张,先记一笔,后续优化与完善. 题意:一个N*M的地图,走过的点不能再走,X为墙弗成走,能否从点S到点D恰好用时T.(1 < N, M < 7; 0 < T < 50) ...
- Tempter of the Bone HDU - 1010(DFS + 奇偶剪枝)
题目 这个题思路不难,就是不用奇偶剪枝的话会出现TLE,奇偶剪枝说白了就是一个矩阵分成两种区域,从一种区域走到另一个区域必是奇数步数,从一种区域走回自己的区域必是偶数步数,就算出现了障碍物这个结论依旧 ...
- Tempter of the Bone(DFS + 奇偶剪枝,好题)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
最新文章
- php-cgi.sock 权限,php-fpm sock文件权限设置
- 韵乐x5最佳参数手动_诺基亚X5、vivoZ1青春版、海信彩墨屏阅读手机A5C对比
- java配置文件中的plugin,启用ContextReplacementPlugin以忽略webpack中的配置和测试设置文件...
- graphical model
- STM32 map文件解析
- 史上最可怕最震撼的46亿年世界历史!看完我跪了....
- 【后台任务】将工作请求发送到后台服务(11)
- Redis持久化方式之RDB
- 从原理到实践,手把手带你轻松get数仓双集群容灾
- Android 面试 缓存,荐【经典面试题】七大缓存经典问题...
- 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
- 令牌环网 IEEE802.5
- 网易邮箱显示服务器返回错误,企业退信的常见问题?
- 微信小程序实现多图片下载
- NAT之SNAT和DNAT
- matlab从入门到精通(二)matlab语言基础
- 顾芊芊坐公车去了铭池学院
- 程序员真实从零开始实操 赚钱渠道之二 群控+极速版
- Flink教程(17)- Flink Table与SQL(案例与SQL算子)
- 2021-2027全球及中国电外科手术钳行业研究及十四五规划分析报告