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

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

所以不可以用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. ArcGIS API for JavaScript 4.2学习笔记[11] 官方第五章Popups(弹窗)概览与解释

    直接跳过第三第四章了,第三章Layer和第四章可视化,怎么说呢,Layer是组织数据的,是Map的属性之一.可视化属于符号化编程,暂时不看. 第五章是对数据.结果的显示,类似于alert()..NET ...

  2. php实现socket推送技术

    在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...

  3. ES6 正则的扩展

    1. RegExp构造函数 ES5中,RegExp构造函数的参数: 参数是字符串,这时第二个参数表示正则表达式的修饰符(flag) 参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝.但是,ES ...

  4. collections --Counter

    collections 模块--Counter 目的是用来跟踪值出现的次数.是一个无序的容器类型,以字典的键值对形式存储,其中元素为 key,其计数作为 value.计数值可以是任意的 Integer ...

  5. Head First设计模式之工厂模式

    一.定义 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类 二.结构 1.抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的 ...

  6. 关于t00ls的挂机脚本

    0x00 前言 今天早上发现t00ls上有人发了个挂机脚本,二十四小时刷时间以及刷Tubi. 轻轻松松升级,坐收Tubi成富翁. 代码很简单,就是带上cookie每隔一段时间(比如60秒)去请求一下某 ...

  7. Mvc项目部署IIS报错:没有为请求的URL配置默认文档,并且没有在服务器设置目录浏览

    问题原因: 1.iis是在安装完.net framework 之后才安装的,需要进行iis注册,开始--运行--cmd,打开命令行提示符,输入命令如下 C:\Windows\Microsoft.NET ...

  8. OLEDB数据源

    title: OLEDB数据源 date: 2018-01-12 21:42:37 tags: [OLEDB, 数据库编程, VC++, 数据库] categories: windows 数据库编程 ...

  9. 更改CentOS 7更新源为国内阿里云提供的源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  10. gulp基于node流的自动化构建工具

    GULP 在我才接触gulp的时候 看他就是一个 通过压缩各种文件来提升用户体验的开发工具   那是因为  对他的理解并不深    他真正强大 之处 在于他的     管子  .pipe()  可以 ...