http://acm.hdu.edu.cn/showproblem.php?pid=1010
题意:给出T,问第T秒是否能从S去到D
Sample Input
4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
Sample Output
NO
YES
这题有2个重要的剪枝要学习
剪枝前后对比
第一个是删掉奇偶剪枝后的情况
第二个是删掉步数剪枝后的情况
#include <iostream>
using namespace std;
char map[8][8];
int r, c, ttime, x2, y2; //ttime 是所给时间T,【r:行、c:列】
bool flag; //x2、y2是终点坐标
int x_move[4] = {0, 1, -1, 0};
int y_move[4] = {1, 0, 0, -1};
void dfs (int x, int y, int t) //t是走到当前坐标时的时刻
{
if (t > ttime) //超时
return ; //下面的tmp的意义:【剩余时间(ttime - t)(记为left)】与【从当前坐标走到终点所需时间( abs(x-x2) + abs(y-y2) )(记为win)】的差,如果tmp是奇数,说明left与win的奇偶性不同!也就是说在第T秒时,不可能从当前坐标走到终点!
int tmp = ttime - t - abs(x-x2) - abs(y-y2);
if (tmp < 0 || tmp & 1) //奇偶剪枝,非常重要,很抽象 Orz...
return ;
for (int i = 0; i < 4; i++)
{
int tx = x + x_move[i];
int ty = y + y_move[i];
if (tx < 0 || ty < 0 || tx >= r || ty >= c)
continue;
if (map[tx][ty] == 'D' && t + 1 == ttime)//到达终点且该时刻t+1为所给时间,即成功到达
{
flag = true;
return ;
}
if (map[tx][ty] == '.')
{
map[tx][ty] = 'X'; //已走格子变成墙,根据题意,已走格子不可再走
dfs (tx, ty, t+1);
if (flag) //成功
return ;
map[tx][ty] = '.'; //回溯
}
}
}
int main()
{
int i, j, x1, y1, empty;
while (scanf ("%d%d%d", &r, &c, &ttime) != EOF)
{
if (!r && !c && !ttime)
break;
empty = 0;
for (i = 0; i < r; i++)
{
scanf ("%s", map[i]);
for (j = 0; j < c; j++)
{
if (map[i][j] == 'S') //找到起点的坐标
x1 = i, y1 = j;
if (map[i][j] == 'D') //找到终点的坐标
x2 = i, y2 = j;
if (map[i][j] == '.') //计算总的可能行走的步数
empty++;
}
}
if (empty + 1 < ttime) //步数剪枝,常识,可行步数小于总时间,在T时刻肯定不可走到终点
{
puts ("NO");
continue;
}
flag = false;
dfs (x1, y1, 0);
if (flag)
puts ("YES");
else puts ("NO");
}
return 0;
}
- 大小: 23.3 KB
分享到:
相关推荐
* 题目1010:Tempter of the Bone,涉及到递归搜索的概念。 * 题目1016:Prime Ring Problem,涉及到递归搜索的概念。 * 题目1026:Ignatius and the Princess I,涉及到完全搜索的概念。 2. 图的遍历:深度优先...
例如,"HDU1010 Tempter of the Bone.cpp"可能就是利用DFS解决了一种寻找最短路径或解谜的问题。 另一方面,广度优先搜索(BFS)则是一种从根节点开始,逐层搜索直至找到目标的算法。BFS通常用于找出图中两个节点的...
这个压缩包文件包含的是从HDU题目ID1010到2500之间的部分解题报告,对于想要提升编程能力、学习算法知识的ACMer来说,是一份宝贵的资源。 这些解题报告通常会包含以下几个方面的重要知识点: 1. **题目描述**:每...
杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题
本报告围绕“ACM.rar”这个压缩包,我们将深入探讨其中涉及到的三道题目——HDU1010、ZOJ1010和ZOJ1015,并分享一些原创解题思路,尽管这些算法可能并非最优,但它们为我们提供了一种独特的视角来理解和解决问题。...
The least common multiple (LCM) of a set of positive integers is the smallest positive integer which is divisible by all the numbers in the set. For example, the LCM of 5, 7 and 15 is 105. Input Input...
HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...
搜索题是 ACM HDU 题目分类中的一大类,例如,1010 搜索题,剪枝很关键;1016 经典的搜索;1026 搜索;1043 经典搜索题,八数码问题;1044 稍微有点麻烦的搜索题;1045 搜索题,可用匹配做 等等。 贪心算法 贪心...
【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...
【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...
The first line of the input contains an integer T(1≤T≤10), denoting the number of test cases. In each test case, there are two integers k,m(1≤k≤1018,1≤m≤100). Output For each test case, print ...
### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...
【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...
hdu2101AC代码
【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...
【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...