HDU 1010 Tempter of the Bone heuristic 剪枝法
本题就是考剪枝法了。
应该说是比较高级的应用了。因为要使用heuristic(经验)剪枝法。要总结出这个经验规律来,不容易。我说这是高级的应用也因为网上太多解题报告都没有分析好这题,给出的程序也很慢,仅仅能过掉,由此看来很多人没有做好这道题。
这里我需要更正一下网上流行的说法:奇偶剪枝法。
其实本题使用奇偶剪枝法并不能太大提高速度,只能说仅仅让使用奇偶剪枝过掉。所以网上说本题使用奇偶剪枝的,其实并不能提高速度。
原因:
奇偶剪枝只能剪枝一次,不能在递归的时候剪枝,因为只要初始化位置符合奇偶性,那么之后的任意方格都会符合奇偶性。
故此理论上也是不能提高速度的,当然本人也实验过多次,证实奇偶剪枝至少对本题来说用处不大。
本题的主要剪枝法应该是一条: 最大空格数和步数比较。就是说如果生下的空格数位grids,而需要走T步,grids < T的时候,就可以判定为NO了。
当然还有第二条剪枝:如果当前位置到目标位置最少需要steps步,而需要走T步,那么steps > T,就可以判定为NO了。
不过事实证明只需要使用第一个剪枝法就可以了。
第二条剪枝用处也不大,原因:递归的格子很少,计算距离差并不能提高多少速度。
如我下面递归循环中只使用一条主要剪枝就足够了,不超100ms。虽然没有做到0ms,不过速度已经是够快的了。
0ms估计需要进一步的剪枝,有大牛,请指教一下。有空要深入研究一下A*算法才行了。
int sr = 0, sc = 0, dr = 0, dc = 0, n, m, grids, Tsec;
vector<string> maze;bool escapeMaze()
{if (sr == dr && sc == dc){if (Tsec == 0) return true;return false;}if (grids < Tsec) return false;if (Tsec == 0) return false;maze[sr][sc] = '$';grids--; Tsec--;if (sr+1 <(int)maze.size() && maze[sr+1][sc] == '.'){sr++;if (escapeMaze()) return true;sr--;}if (sc+1 < (int)maze[0].size() && maze[sr][sc+1] == '.'){sc++;if (escapeMaze()) return true;sc--;}if (sc > 0 && maze[sr][sc-1] == '.'){sc--;if (escapeMaze()) return true;sc++;}if (sr > 0 && maze[sr-1][sc] == '.'){sr--;if (escapeMaze()) return true;sr++;}maze[sr][sc] = '.';grids++; Tsec++;return false;
}int main()
{while (scanf("%d %d %d", &n, &m, &Tsec) && n){grids = n * m - 1;maze.clear(); maze.resize(n);for (int i = 0; i < n; i++){cin>>maze[i];for (int j = 0; j < m; j++){if (maze[i][j] == 'S') sr = i, sc = j; //别忘记了这里是'S'else if (maze[i][j] == 'D') dr = i, dc = j, maze[i][j] = '.';else if (maze[i][j] == 'X') grids--;}}int t = Tsec - (abs(dr - sr) + abs(dc-sc));if (t < 0 || (t & 1) || grids < Tsec) puts("NO");else if (escapeMaze()) puts("YES");else puts("NO");}return 0;
}
HDU 1010 Tempter of the Bone heuristic 剪枝法相关推荐
- HDU 1010 Tempter of the Bone heuristic 修剪
的问题是,在测试修剪. 应该说是更先进的应用. 由于使用的heuristic(经验)修剪.总结这方面的经验法则,别easy.我说,这也是由于先进的在线报告中的应用程序没有分析太多太好的解决这个问题,计 ...
- 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 DFS(奇偶剪枝优化)
需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...
- 输入空格hdu - 1010 - Tempter of the Bone
时间紧张,先记一笔,后续优化与完善. 题意:一个N*M的地图,走过的点不能再走,X为墙弗成走,能否从点S到点D恰好用时T.(1 < N, M < 7; 0 < T < 50) ...
- (step4.3.1) hdu 1010(Tempter of the Bone——DFS)
题目大意:输入三个整数N,M,T.在接下来的N行.M列会有一系列的字符.其中S表示起点,D表示终点. .表示路 . X表示墙...问狗能有在T秒时到达D.如果能输出YES, 否则输出NO 解题思路:D ...
- HDU1010:Tempter of the Bone(dfs+剪枝)
http://acm.hdu.edu.cn/showproblem.php?pid=1010 //题目链接 http://ycool.com/post/ymsvd2s//一个很好理解剪枝思想的博客 ...
- HDU1010 Tempter of the Bone DFS+剪枝
点击打开链接 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
最新文章
- 什么意思_手机HD是什么意思 手机信号区显示hd是什么意思
- 一种压缩图片的方法---Machine learning 之 K-Means
- 作者:李海生(1974-),男,博士,食品安全大数据技术北京市重点实验室、北京工商大学计算机与信息工程学院教授、研究生导师...
- MYSQL执行计划EXPLAIN
- 傲游浏览器linux傲游源,Ubuntu下安装遨游浏览器
- 宅在家里写数据库中事务(ACID)
- GitLab CI/CD conda: command not found
- pert图java_项目管理之甘特图和工程网络图(PERT图)(一)
- java分层ppt_java程序设计第10章图形用户界面.ppt
- swot分析法案例_型男收割机之SWOT分析法——大龄剩女脱单攻略
- 《高效能程序员的修炼》一磨刀不误砍柴工
- facebook登陆按钮_为什么Facebook Like按钮占平均网站代码的16%
- Qt中容器类型控件介绍
- 家用智能投影仪首选,走进极米H3S投影
- Oracle 各备份恢复环境中SCN的理解
- linux卸载phpstudy_centos
- Meta-Weight-Net[NIPS‘2019]:关于元学习/域自适应(meta learning/domain adaptation)优化噪声标签与类别不平衡的问题
- 长歌行 宋 郭茂倩收编的《乐府歌词》汉代民间诗歌
- 云端极简部署Svelte3聊天室
- 敏涵国际品牌:定义高端美妆新力量
热门文章
- Spring MVC数据绑定 ----从入门到精通篇(三) POJO数据类型的绑定和自定义数据绑定
- 编号为1,2,3,4.......n的一群人沿顺时针方向围绕一圈的问题
- 08_面向对象的三大特性
- QT练习Http通信代码下载器
- dvd转wmv及wmv转flv参数(3M/1min)
- 光遇钢琴mysql_光遇怎么弹琴 弹琴方法
- 设置word第几页共几页去除目录摘要页
- [附源码]Nodejs计算机毕业设计宿舍人员签到管理系统Express(程序+LW)
- 新一代大学英语提高篇U校园答案汇总
- mysql sql语句生成日历表