HDU 1010 Tempter of the Bone heuristic 修剪
的问题是,在测试修剪。
应该说是更先进的应用。
由于使用的heuristic(经验)修剪。总结这方面的经验法则,别easy。我说,这也是由于先进的在线报告中的应用程序没有分析太多太好的解决这个问题,计划给也很慢,只有失去了。从这个很多人不这样做的问题。
这里我须要更正一下网上流行的说法:奇偶剪枝法。
事实上本题使用奇偶剪枝法并不能太大提快速度,只能说只让使用奇偶剪枝过掉。
所以网上说本题使用奇偶剪枝的,事实上并不能提快速度。
原因:
奇偶剪枝仅仅能剪枝一次,不能在递归的时候剪枝,由于仅仅要初始化位置符合奇偶性,那么之后的随意方格都会符合奇偶性。
故此理论上也是不能提快速度的。当然本人也实验过多次。证实奇偶剪枝至少对本题来说用处不大。
本题的主要剪枝法应该是一条: 最大空格数和步数比較。就是说假设生下的空格数位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;
}
版权声明:笔者靖心脏,景空间地址:http://blog.csdn.net/kenden23/,只有经过作者同意转载。
HDU 1010 Tempter of the Bone heuristic 修剪的更多相关文章
- HDU 1010 Tempter of the Bone --- DFS
HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...
- HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone 奇偶剪枝
如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...
- hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Hdu 1010 Tempter of the Bone 分类: Translation Mode 2014-08-04 16:11 82人阅读 评论(0) 收藏
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone 深搜+剪枝
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone(dfs)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
随机推荐
- percona-toolkit源码编译安装
安装依赖软件yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMakeryum install perl-Time-HiRes perl-DB ...
- 【Codeforces Round #439 (Div. 2) C】The Intriguing Obsession
[链接] 链接 [题意] 给你3种颜色的点. 每种颜色分别a,b,c个. 现在让你在这些点之间加边. 使得,同种颜色的点之间,要么不连通,要么连通,且最短路至少为3 边是无向边. 让你输出方案数 [题 ...
- 【Codeforces Round #439 (Div. 2) A】The Artful Expedient
[链接] 链接 [题意] [题解] 暴力 [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] #include <bits/stdc++.h> using namespa ...
- CTR深度学习
深度学习在 CTR 中应用 一. Wide&&Deep 模型 首先给出Wide && Deep [1] 网络结构: 本质上是线性模型(左边部分, Wide model) ...
- 【44.10%】【codeforces 723B】Text Document Analysis
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 利用C#与AE调用GP工具
转自原文 利用C#与AE调用GP工具 第一,首先要明确自己需要调用arctoolbox里面的什么工具,实现什么样的功能. 第三,编写command或tool工具,编写自己要的功能工具. 1)首先创建一 ...
- 从头认识Spring-2.3 注解装配-@autowired(5)-限定器@Qualifier(1)
这一章节我们来具体讨论一下配合@autowired一起使用的限定器@Qualifier. 1.domain(重点) 蛋糕类: package com.raylee.my_new_spring.my_n ...
- [Angular Directive] Create a Template Storage Service in Angular 2
You need to define a <template> to be able to use it elsewhere in your app as a TemplateRef. Y ...
- js时间和时间戳之间如何转换(汇总)
js时间和时间戳之间如何转换(汇总) 一.总结 一句话总结: 1.js中通过new Date()来获取时间对象, 2.这个时间对象可以通过getTime()方法获取时间戳, 3.也可以通过getYea ...
- 在C++ Builder6上使用Boost正则表达式库
本文关键词:正则表达式 c++ python 软件 正则表达式是一种模式匹配形式,它通常用在处理的文本程序中.比如我们经常使用的grep工具,还是perl语言都使用了正则表达式. 正则表达式是一种模式 ...