`

HDU 1010 Tempter of the Bone

阅读更多
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
27
23
分享到:
评论

相关推荐

    HDU图论题目分类

    * 题目1010:Tempter of the Bone,涉及到递归搜索的概念。 * 题目1016:Prime Ring Problem,涉及到递归搜索的概念。 * 题目1026:Ignatius and the Princess I,涉及到完全搜索的概念。 2. 图的遍历:深度优先...

    ACM.zip_visual c

    例如,"HDU1010 Tempter of the Bone.cpp"可能就是利用DFS解决了一种寻找最短路径或解谜的问题。 另一方面,广度优先搜索(BFS)则是一种从根节点开始,逐层搜索直至找到目标的算法。BFS通常用于找出图中两个节点的...

    HDU 1010-2500解题报告

    这个压缩包文件包含的是从HDU题目ID1010到2500之间的部分解题报告,对于想要提升编程能力、学习算法知识的ACMer来说,是一份宝贵的资源。 这些解题报告通常会包含以下几个方面的重要知识点: 1. **题目描述**:每...

    hdu1010搜索算法

    杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题

    ACM.rar_ACM 绠楁硶_HDU1010_hdu 18

    本报告围绕“ACM.rar”这个压缩包,我们将深入探讨其中涉及到的三道题目——HDU1010、ZOJ1010和ZOJ1015,并分享一些原创解题思路,尽管这些算法可能并非最优,但它们为我们提供了一种独特的视角来理解和解决问题。...

    HDU1019(2028)解题报告

    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.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    ACM HDU题目分类

    搜索题是 ACM HDU 题目分类中的一大类,例如,1010 搜索题,剪枝很关键;1016 经典的搜索;1026 搜索;1043 经典搜索题,八数码问题;1044 稍微有点麻烦的搜索题;1045 搜索题,可用匹配做 等等。 贪心算法 贪心...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    code_hdu.rar_ACM_The First_hdu_test case example

    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高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU1059的代码

    HDU1059的代码

    hdu1001解题报告

    hdu1001解题报告

    hdu 1574 passed sorce

    hdu 1574 passed sorce

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu2101解决方案

    hdu2101AC代码

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    杭电ACMhdu1163

    【标题】:杭电ACMhdu1163 【描述】:这是一道源自杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的ACM编程竞赛题目,编号为1163。这类问题通常需要参赛者利用计算机编程解决数学、逻辑或算法上的挑战,...

Global site tag (gtag.js) - Google Analytics