hdu_1010_Tempter of the Bone_dfs
题意:给出一个地图,起点和终点,四通路(上下左右),问在一定的时间内可以走出这个地图吗
题解:首先这个题意一定要好好读,很容易读错题,理解成最短路径小于给定时间就可以出去,其实是不可以的,必须要在给定的时间恰好到达终点才可以走出地图。
所以不可以用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的更多相关文章
随机推荐
- Pipeline in scala——给scala添加管道操作
linux系统中管道这一功能相信大家肯定使用过,比如现在想找到用户目录下文件名包含db的所有文件,ls ~的结果,作为grep db的参数: ➜ ~ ls ~ | grep db kv.mv.db ...
- 模板引擎(smarty)知识点总结三
阔别了几个月,小杨又来分享php知识.话不多说,言归正传,今天继续带来smarty的知识点. -----------------smarty assign append 详解 对于这两个的区别和联系 ...
- linux下制作镜像文件
第一:制作iso镜像的方法: 把/dev/cdrom目录制作为镜像,名字为/root/rh1.iso 方法1:dd if=/dev/cdrom of=/root/rh1.iso 方法2:#cat /d ...
- Linux发行版 CentOS6.5 修改默认主机名
修改前准备 我们将主机名修改为comexchan.cnblogs.com(本文发布于http://comexchan.cnblogs.com/) 备份相关配置文件,以便回滚 cp /etc/sysco ...
- Nodejs使用redis
安装方法 安装redis方法请自行百度, 用npm方法,安装nodejs的redis模块 npm install redis 实战 var redis = require("redis&qu ...
- Git 进阶 —— 远程仓库
一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...
- Ubuntu16.04 编译 OpenJDK7
<深入理解Java虚拟机>第二版第一章实践 准备 Mercurial sudo apt-get install mercurial OpenJDK7 hg clone http://hg. ...
- sql server 权限
-----是否存在有效的登录账号:是否被禁用,sql login还有:密码是否过期,是否被锁定 select is_disabled, loginproperty(name,'Isexpired') ...
- Shell脚本实现文件遍历和删除操作
本文需要实现的功能如下:某文件夹下具有由按数字编号命名的文件夹,需要删除除最大编码外的文件. 具体实现 大致思路:循环遍历该文件夹下所有文件,正则匹配出最大编码文件:然后循环文件,删除除最大编码外的文 ...
- 使用git工具将项目上传到github
注册github账号 https://github.com/ 安装git工具: https://git-for-windows.github.io/ 上面的准备工作完成后,现在开始操作. 一.进入gi ...