题意:从开始位置走到结束位置,恰好走 t 步 YES

否则 NO

搜索题,由于是恰好走到,所以用到了奇偶剪枝

什么是奇偶剪枝,我也是刚知道

所给步数为 t ,起始位置坐标 (begin_x,begin_y), 结束位置坐标 (end_x,end_y)

两位置最短距离为 ju = abs(end_x - begin_x) + abs(end_y - begin_y)

若 t - ju 为奇数,则无论如何不能恰好走到

为偶数才有可能恰好走到

代码中 pos + dis 即 ju

代码如下:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
int m,n,t;
char map[][];
int vis[][];
int flag;
int begin_x,begin_y,end_x,end_y;
int p[][] = {{-,},{,},{,},{,-}}; //偏移量:上,下,左,右
void dfs(int x,int y,int pos) //pos 为当前已走步数
{
if(flag) return ; //剪枝:已经到达目的地
if(pos > t) return ; //剪枝:步数超过 t
if(x == end_x && y == end_y && pos == t) //恰好 t 步走到
{
flag = ;
return ;
}
int dis = abs(end_x - x) + abs(end_y - y); //当前位置到结束位置的最短距离
if((t - dis - pos) % != ) return; //奇偶剪枝,很重要,不剪TLE
for(int i = ; i < ; i ++) //搜索四个方向
{
int tx = x + p[i][];
int ty = y + p[i][];
if(tx >= && tx < m && ty >= && ty < n && !vis[tx][ty] && map[tx][ty] != 'X')
{
vis[tx][ty] = ;
dfs(tx,ty,pos + );
vis[tx][ty] = ;
}
}
}
int main()
{
while(~scanf("%d%d%d",&m,&n,&t) && (m || n || t))
{
memset(vis,,sizeof(vis));
flag = ;
int k = ;
for(int i = ; i < m; i ++)
{
for(int j = ; j < n; j++)
{
cin>>map[i][j]; //scanf注意回车
if(map[i][j] == 'S')
{
begin_x = i;
begin_y = j;
vis[i][j] = ;
}
if(map[i][j] == 'D')
{
end_x = i;
end_y = j;
}
if(map[i][j] == 'X')
k ++;
}
}
if((m * n - k) > t) dfs(begin_x,begin_y,);
if(flag) printf("YES\n");
else printf("NO\n");
}
return ;
}

HDU 1010 Tempter of the Bone的更多相关文章

  1. HDU 1010 Tempter of the Bone --- DFS

    HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...

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

  3. hdu 1010 Tempter of the Bone 奇偶剪枝

      如果所给的时间(步数) t 小于最短步数path,那么一定走不到. 若满足t>path.但是如果能在恰好 t 步的时候,走到出口处.那么(t-path)必须是二的倍数. 关于第二种方案的解释 ...

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

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

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

  7. hdu 1010 Tempter of the Bone 深搜+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

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

  9. hdu 1010 Tempter of the Bone(深搜+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. 题解报告:hdu 1010 Tempter of the Bone

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 Problem Description The doggie found a bone in a ...

随机推荐

  1. 数据库mysql优化方案

    1.创建索引对于查询占主要的应用来说,索引显得尤为重要.很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致.如果不加索引的话,那么查找任何哪怕只是一条特定的数据 ...

  2. 图解 classpath

    先引用几句网上流传的话: 首先 classpath是指 WEB-INF文件夹下的classes目录 classpath 和 classpath* 区别: classpath:只会到你指定的class路 ...

  3. robotium(及百度cafe)运行testcase之后程序挂起没有响应的原因调查及解决

    一.问题背景 刚开始用的是百度cafe搭建的框架,已经用了一些版本,最后的test版本在7.4的apk上能跑,但是在最新发布的7.5的版本上跑不了,直接提示nullPointer错误,通过打日志的方式 ...

  4. 第11章 .NET Remoting

    11.1理解remoting 11.1.1应用程序域基本概念 .NET提供了一项技术,使得跨应用程序域中的对象也可以相互访问,该技术就是.NET remoting.(185) 11.1.2应用程序域的 ...

  5. HR常用事务代码

    HR TCODE 描述     PA30 维护人力资源主数据 PA40 人事活动

  6. 【随笔】从gitHub上获取源码

    有时候,需要从gitHub上获取源码,下面介绍几个方法: 1.获取链接: 打开gitHub代码库的页面,能在右边看到这个: 点击红圈里的标记,该链接就会复制下来. 然后,如果安装了小乌龟(Tortoi ...

  7. 数组 Arrays类

    1.数组是一组变量集合,用来存储相同数据类型的一组数据的连续的空间. *数组名(标识符)连续空间首地址. *元素下标标明元素在数组中的位置,从0开始. *每个元素都可以通过下标来访问. *数组长度固定 ...

  8. UNIX 系统调用函数errno返回值搜集(in updating )

    当Unix系统级函数遇到错误时,它们会典型地返回-1,并设置全局整数变量errno来表示什么出错了 阅读redis源码的时候,发现如果对系统级函数出错时的errno比较熟悉,写起程序来会游刃有余不少. ...

  9. 《笨办法学C》笔记之Makefile

    使用gcc编译C语言源码 在Linux系统中,C语言源码需要用gcc编译为二进制可执行文件,才能够运行. $ gcc test.c -o test 这句命令就将test.c文件编译为test二进制可执 ...

  10. win64

    修改IIS应用程序池,启用支持32位 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary AS