hdu-1010-Tempter of the Bone

HDU图论题目分类 立即下载
The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.
 

Input
The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

'X': a block of wall, which the doggie cannot enter;
'S': the start point of the doggie;
'D': the Door; or
'.': an empty block.

The input is terminated with three 0's. This test case is not to be processed.
 

Output
For each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise.
 

Sample Input
4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0
 

Sample Output
NO YES


方法一:

#include<stdio.h>
#include<string.h>
#include<math.h>
char map[10][10];
int n,m,t,di,dj,wall,flag;
int next[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int xi,int xj,int count)
{
    int i,tem;
    if( xi > n || xj > m|| xi <=0 || xj <=0)
    {
        return;
    }
    if(count==t && xi==di && xj==dj)
    {
        flag=1;
    }
    if(flag == 1)
        return;
      tem  = ( t - count) - abs ( xi - di) - abs( xj - dj); 
    if(tem < 0 || tem%2!=0 )
        return ;
    for(i=0;i<4;i++)
    {
        if(map[xi+next[i][0]][xj+next[i][1]]!='X')
        {
            map[xi+next[i][0]][xj+next[i][1]]='X';
            dfs(xi+next[i][0],xj+next[i][1],count+1);
            map[xi+next[i][0]][xj+next[i][1]]='.';
        }
    }
    return ;
}
int main()
{
    int i,j,si,sj;
    while(scanf("%d%d%d%*c",&n,&m,&t),n!=0&&m!=0&&t!=0)
    {
        wall=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='S')
                    si=i,sj=j;
                if(map[i][j]=='D')
                    di=i,dj=j;
                if(map[i][j]=='X')
                    wall++;
            }
            getchar();
        }
        if(n*m-wall<=t)
        {
            printf("NO\n");
            continue;
        }
        flag=0;
        map[si][sj]='X';
        dfs(si,sj,0);
        if(flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

方法二:

#include<stdio.h>
#include<math.h>
#include<string.h>
char map[10][10];
int xi,xj,di,dj,n,m,t;
int next[4][2]={{1,0},{-1,0},{0,1},{0,-1}},book[10][10],flag;
void dfs(int xi,int xj,int step)
{
    int i,ti,tj;
    if(xi==di&&xj==dj)
    {
        if(t==step)
            flag=1;
        return;
    }
    if(step>=t)
        return;
    if(map[xi][xj]!='X')
    {
        for(i=0;i<4;i++)
        {
            ti=xi+next[i][0];
            tj=xj+next[i][1];
            if(map[ti][tj]!='X'&&ti>=0&&ti<n&&tj>=0&&tj<m&&book[ti][tj]!=1)
            {
                book[ti][tj]=1;
                dfs(ti,tj,step+1);
                book[ti][tj]=0;
                if(flag)
                    return;
            }
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&n,&m,&t),n!=0&&m!=0&&t!=0)
    {
        int i,step=0,j;
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='S')
                {
                    xi=i;
                    xj=j;
                }
                if(map[i][j]=='D')
                {
                    di=i;
                    dj=j;
                }
            }
        }
        getchar();
        memset(book,0,sizeof(book));
        if(abs(xi-di)+abs(xj-dj)>t||(xi+xj+di+dj+t)%2==1)
        {
            printf("NO\n");
            continue;
        }
        book[xi][xj]=1;
        flag=0;
        dfs(xi,xj,step);
        if(flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

以上两种方法都用到了奇偶剪枝!!!!!

那什么是奇偶剪枝呢!

其实它的理解很绕,内容有介绍起来很多很烦,但是大家要仔细看,并且去理解它。

先看这样的一个矩阵:

矩阵形式如下: 

0 1 0 1 0 1 

1 0 1 0 1 0 

0 1 0 1 0 1

1 0 1 0 1 0 

0 1 0 1 0 1 
从为 0 的格子走一步,必然走向为 1 的格子 。
从为 1 的格子走一步,必然走向为 0 的格子 。


由上面的可以得到以下的结论: 
  1.从 0 走向 1 (或 1 走向 0 )必然是奇数步。

  2.从 0 走向 0( 或 1 走向 1 )必然是偶数步。

So

当遇到下面两种情况时,都可以直接判断不可达!

  1. 从 0 走向 0 ,要求时间(所剩的时间)是奇数的。
  2. 从 1 走向 0 ,要求时间(所剩的时间)是偶数的。


本题的两个解法:

解法1:

tem=(t-count)-abs(xi-di)-abs(xj-dj);
    if(tem < 0 || tem%2!=0 )
        return;


这是它的核心代码。
令 最少需要的步数为a=abs(xi-di)+abs(xi-xj) ,剩下的步数为b=t-count 。(这里就这样表示了,都懂啊!@-@)
则
如果a为奇数,则一定是 从 0 走向 1 (或 1 走向 0)。
如果a为偶数,则一定是 从 0 走向 0 (或 1 走向 1)。

如果b为奇数,则一定是 从 0 走向 1 (或 1 走向 0)。
如果b为偶数,则一定是 从 0 走向 0 (或 1 走向 1)。

因为
偶数-奇数 = 奇数,奇数-偶数 = 奇数,奇数-奇数= 偶数,偶数-偶数=偶数。
所以
b-a得到结果直接判断奇偶就行了。

解法2的代码
里面用一个book数组来标记这个地方是否走过。其他的问题和解法1 大同小异。耐下心来好好分析就知道啦!!!!!



解释了这么多不知道你们是否能明白。。。。。。。。。。。。。。

有问题留言吧!!!!

解决国内网页无法加载reCaptcha的方法 科普: reCaptcha是Google公司的验证码服务,方便快捷,改变了传统验证码需要输入n位失真字符的特点。reCaptcha在使用的时候是这样的: 只需要点一下复选框,Google会收集一些鼠标轨迹、网络信息、浏览器信息等等,依靠后端的神经网络判断是机器还是人,绝大多数验证会一键通过,无需像传统验证码一样。但是reCaptcha使用了google.com的域名,这个域名在国内是被墙的。所以,也就导致了官网上无法注册/登录的问题,挡住了不少人入正的脚步。 解决办法: 【第一步】安装fir 阅读详情

相关推荐

MCGS触摸屏数据记录与U盘导出配置全解析

在工业自动化现场,数据记录是设备运行状态分析与故障追溯的基础。HMI触摸屏作为人机交互核心,不仅承担实时监控任务,还负责过程数据的存储与导出。理解数据采集周期、存盘机制与存储介质的匹配原理,能帮助工程师高效配置数据记录功能。合理运用定时存盘、存盘组与U盘导出,可支撑设备趋势分析、报表生成及事故排查。本文以MCGS触摸屏为例,详解数据记录的完整组态流程,并汇总常见配置陷阱与排查思路,为现场调试与长期运维提供可落地的技术参考。

weixin_34253126的博客 459

Tempter of the Bone(详解)

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone ...

聪明绝顶的你与即将秃头的我 4871

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 401

翻译(8)

题目:Tempter of the Bone | JXNUOJ 描述: The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he

Ling_1501的博客 338

Mac版UltraEdit 18.00.0.19破解教程:终端一行命令搞定(附版本适配指南)

本文为Mac用户提供了UltraEdit的合法替代方案与授权指南,强调破解软件的法律风险和安全隐忧。推荐使用VS Code、Sublime Text等开源或商业编辑器,结合终端工具如Vim/Neovim,实现高效文本编辑。同时详细介绍了UltraEdit的官方授权选项,帮助开发者在遵守软件许可的前提下提升工作效率。

k9l0m1的博客 352

高校学籍管理系统(SQL Server数据库课程设计)

摘要: 高校的管理工作是一项复杂且系统化的工作。而随着当代社会积极响应国家“科教兴国”的战略。高校建设规模和招生人数每年均高不下,庞大的学生群体对高校的管理工作带来了巨大的挑战。而对学生的学籍管理工作更是高校管理工作的一个重要环节。 面对高校学生学籍信息如此庞大的数据群,如采用传统的管理模式,管理工作的效率不仅低下,而且数据错误的发生率相对较高,还会产生人力和物力上的巨大开支。面对这样的情况,开发一个高校学籍管理系统就显得尤为重要。 运用高校学籍管理系统可以大大提高高校管理工作效率、方便系统维护、减小开支、

qq_52030824的博客 7万+

Tempter of the Bone(白骨的诱惑者)(dfs经典模板题) HDU - 1010

题目:Tempter of the Bone(白骨的诱惑者)中文大意 The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tr

R_711的博客 1159

SAP 生产订单归档简介

通常在使用了几年的SAP后,系统中会产生非常多的数据在系统中,特别是制造业的生产订单,常年的累积会存在很多的订单在系统中,这个时候就可以使用归档的功能,对生产订单进行处理。标记DLFL的前提是需要完成生产订单的差异结算,DLFL标记可以清除掉生产订单的相关需求和预留。6、在执行CO78选择删除,前面的操作相当于我们把需要归档的数据写入了数据库中,现在正式进行数据的归档删除。然后我们co03在去看生产订单,可以看到生产订单中多了删除的状态和标记的状态。我这里直接执行的程序PPARCHP1,效果其实是一样的。

我小时候很黑的博客 2284

hduoj 1010 【Tempter of the Bone】 奇偶剪枝 DFS

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the b...

jqq0102的博客 284

Android系统开机时间分析与优化指南

本文系统阐述了Android开机时间优化的全流程技术方案。首先详细解析了从电源键按下到桌面显示的完整启动流程及关键事件序列,然后介绍了秒表计时、日志分析和自动化脚本三种测量方法。重点从底层和上层两个维度提出了具体优化措施:底层包括编译器优化、内核驱动裁剪和日志精简;上层涵盖系统服务参数调整、应用预优化和功能组件精简。最后提供了验证工具和方法,并强调优化需要在性能、功耗和功能间取得平衡。通过这套系统化方案,可有效提升Android设备的开机速度与用户体验。

学无止境 350

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 261

Tempter of the Bone(DFS+剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87885    Accepted Submission(s): 23909 Problem Description The

不会思考的机器 479

有限元之有限元空间的构造

主要介绍有限元的空间构造方法。

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 762

HDU-1010Tempter of the Bone(dfs+奇偶剪枝)

Tempter of the Bone 题目链接 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 157407 Accepted Submission(s): 41882 Problem Description The doggie...

孤风的博客 587

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

HDU-1010-Tempter of the Bone

HDU-1010-Tempter of the Bone http://acm.hdu.edu.cn/showproblem.php?pid=1010 给这题折腾了半天啊,刚开始用BFS写的,总是WA,后来发现这题要求在给定的时间点到达,不能早,也不能迟,而BFS每次求出的是最短时间,不合题意,于是转用DFS,剪枝的方法是参考HDU的PPT写的,居然还要考虑奇偶性 可以把map看成这样:

菜鸟的程序人生 960

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

HDU1010 Tempter of the Bone(DFS+奇偶剪枝)

题目:HDU1010 Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 161732Accepted Submission(s): 42908 Problem Descriptio...

CarreLiu 224

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hdu 1010 Tempter of the Bone(dfs+剪枝)

题目链接:hdu 1010 Tempter of the Bone(dfs+剪枝) 题意:狗狗从S出发,要在正好t秒的时候到达D,每一块地只能走一次,X代表墙不能走,问能否到达 思路:深搜,但是需要剪枝,每走一步,判断能否在剩下的时间中不考虑墙通过最短的路到达出口,若不能直接返回。 #include&lt;cstdio&gt; #include&lt;cstring&gt; #incl...

yz467796454的博客 294

HDU 1010 Tempter of the Bone (DFS+奇偶剪枝)

奇偶剪枝得到新技能

n-1 742

HDU1008——Elevator,HDU1009——FatMouse‘ Trade,HDU1010——Tempter of the Bone

使用曼哈顿距离作为预估剩余步数的方法,如果剩余步数不足以到达终点,或者剩余步数与曼哈顿距离的差值的奇偶性不同(意味着无法刚好在剩余时间内到达),则直接返回,避免不必要的递归。如果相邻格子在迷宫范围内,并且是可以通行的或为终点,则进行递归调用,并将剩余时间减少1。:首先,我们需要计算出每个房间的单位成本效益,即每磅猫粮能换取多少磅JavaBeans。接着,找出起点和终点的位置,并调用。:从单位成本效益最高的房间开始,尝试用完所有M磅的猫粮。:在交易的过程中,累计可以获得的JavaBeans总量。

u014114223的博客 1468

hdu_1010 Tempter of the Bone

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 分析:题意即为再规定的时间内从开始点走在结束点。

徵羽調_xiao賤的专栏 882

HDU-1010 Tempter of the Bone

搜索 HDU-1010 Tempter of the Bone 题目链接:杭电1010 题目大意:小狗要逃生 只能四个方向走 且走过的地方不能再走 还只能在特定的时间逃生 不能多不能少 解题思路:正常的DFS 想的点要多一点 超时了三次 超时要return 到地方没到时间要return 最最重要的是走过的地方要标记为墙 防止出现出口堵住还瞎探索浪费时间的情况 注意这点的分支行不通时要将点还原 代...

鱼头的水题之路 217

HDU.1010 Tempter of the Bone

文章目录一、题目解读1、原题2、分类3、题意4、输入输出格式5、数据范围二、题解参考1、总体思路2、思路①(1).分析(2).AC代码三、评价与后话1、评价2、奇偶剪枝0-1示图绘制代码(C++——EasyX)3、后话 一、题目解读 1、原题 HDU.1010 Tempter of the Bone 2、分类 回溯法 3、题意 给定一个N×MN \times MN×M的迷宫让一只狗去走,迷宫中有一...

God-Excious的博客 808

hdu1010 Tempter of the Bone

Tempter of the Bone                                 ime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                             Total Submission(s)

just_for_your_smile的专栏 2万+

hdu1010 Tempter of the Bone

hdu 1010 这是一道剪枝的好题;开始时是朴素的当时间t > T || (t >= T&&g[][] != 'D')时,就return;但是还是TLE;之后看了题解说还要加一个奇偶剪枝,就是对每个坐标;将该点坐标的横坐标和纵坐标加起来奇偶性,这样就是斜对角的划分了;很容易知道之后如果S和D的奇偶性不同,还和t的奇偶性对不上就直接output了;但是有个疑问就是问什么一个看似 作用不大的"

hxer 431

hdu 1010 Tempter of the Bone[dfs]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

835

hdu 1010 Tempter of the Bone(bfs)

hdu 1010 Tempter of the Bone http://acm.hdu.edu.cn/showproblem.php?pid=1010 ProblemDescription Thedoggiefoundaboneinanancientmaze,whichfascinatedhimalot.However,whenhep...

diansitao5461的博客 199
上一篇: hdu-1238-Substrings-c语言
下一篇: zzuli-1858-单词翻转
Bigdz
博客等级 码龄10年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值