题意:给出一个地图,起点和终点,四通路(上下左右),问在一定的时间内可以走出这个地图吗

题解:首先这个题意一定要好好读,很容易读错题,理解成最短路径小于给定时间就可以出去,其实是不可以的,必须要在给定的时间恰好到达终点才可以走出地图。

所以不可以用bfs,这里采用dfs的方法,暴力的dfs肯定会超时,因为要枚举每一条道路,所以我们介绍一种剪枝的思路——奇偶剪纸

还要考虑两个剪枝,就是当能走的步数小于给定的时间肯定不能出去和如果搜索到的步数已经大于给定时间了就不再搜索。

奇偶剪枝:

奇偶剪纸的含义通俗的我的理解是一个地图,以黑白间隔涂色,白色格子可以一步到达的格子为黑色,黑色格子一步可以到达的格子为白色

那么很容易得出,从黑色格子走到另一个黑色格子肯定是经过了偶数步,对于这个题来说,我们知道从某一个位置(x1,y1)->(x2,y2)的时候

所需要的步数一定和(x2-x1)+(y2-y1)这种走法的奇偶性相同。

注意:

这个题输入竟然有坑,好像有非法输入案例,因为一定要把getchar()写在每行读入的最后面,或者是每次读入一个字符串的形式读一行才不会出错。------这里至今不是很明白为啥,,,因为这个读入wa了n次

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,t;
int sx,sy;
int dx,dy;
int go[][] = {{,-},{,},{,},{-,}};
int vis[][];
char mp[][];
bool in(int x, int y)
{
if(x<n&&x>=&&y>=&&y<m&&vis[x][y]==) return true;
return false;
}
bool dfs(int x, int y, int time)
{
if(x==dx&&y==dy&&time==t){
return true;
}
if(time>=t) return false;
if(((t-time)%)!=((abs(x-dx)+abs(y-dy))%)) return false;
if((t-time-abs(x-dx)-abs(y-dy))<) return false;
int tx,ty;
for(int i = ; i < ; i++){
tx = x+go[i][];
ty = y+go[i][];
if(in(tx,ty)){
vis[tx][ty] = ;
if(dfs(tx,ty,time+)) return true;
vis[tx][ty] = ;
}
}
return false;
}
int main()
{
int num;
while(~scanf("%d%d%d",&n,&m,&t))
{
num = ;
if(n==&&m==&&t==) return ;
getchar();
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++){
scanf("%c",&mp[i][j]);
if(mp[i][j]=='S'){sx = i; sy = j;vis[i][j] = ;}
else if(mp[i][j]=='D'){dx = i; dy = j;vis[i][j] = ;}
else if(mp[i][j]=='X'){vis[i][j] = ;num++; }
else vis[i][j] = ;
}
getchar();
}
if(n*m-num-<t)printf("NO\n");
else if(dfs(sx,sy,)) printf("YES\n");
else printf("NO\n");
}
return ;
}

hdu_1010_Tempter of the Bone_dfs的更多相关文章

随机推荐

  1. samba 搭建

    #useradd -M -s /sbin/nologin kvmshare #mkdir /home/etl #chown kvmshare:kvmshare /home/etl 将本地账号添加到 s ...

  2. Servlet小总结

    Servlet Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,像JSP一样,生成动态的Web页.Servlet主要运行在服务器端,并由服务器调用执行. Servlet处理的基本 ...

  3. php中static 静态关键字

    一直依赖对于php中static关键字比较模糊,只是在单例模式中用过几次.上网查了查,没有找到很全的介绍,自己总结一下. 根据使用位置分为两部分 1.函数体中的静态变量 2.类中的静态属性和方法 1 ...

  4. lesson - 10 shell 基础知识

    课程大纲: 1. shell特性 命令历史 history !!  !$  !n  !字符 Tab 键可以补全文件路径或者命令 alias  a=“b”  unalias a 通配符 *匹配零个或多个 ...

  5. java复写equals例子

    public class users { String name; static int age; public boolean equals(Object obj) { if(this==obj){ ...

  6. Oracle学习笔记_09_字符串相关函数

    二.参考资料 0.Oracle中的字符串类型及相关函数详解 1.ORACLE 字符串操作 2.oracle函数大全-字符串处理函数

  7. mysql zip 版安装

    http://jingyan.baidu.com/article/8cdccae946133f315513cd6a.html

  8. PHP进阶,使用交互模式进行快速测试实验?

    额,那啥,PHP很强,大家都知道哈.不过呢,在搞PHP里的人中,自然也要分高下的.当然了,我更喜欢用好玩来形容了. 什么叫做快速开发?我觉得,快就得快到随手写几个字,就能让代码跑起来!那么,PHP能做 ...

  9. JavaScript ES6中export及export default的区别

    相信很多人都使用过export.export default.import,然而它们到底有什么区别呢? 在JavaScript ES6中,export与export default均可用于导出常量.函 ...

  10. vue2.0 如何在hash模式下实现微信分享

    最近又把vue的demo拿出来整理下,正好要做"微信分享"功能,于是遇到新的问题: 由于hash模式下,带有"#",导致微信分享的签证无效:当改成history ...