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的更多相关文章
随机推荐
- HTML篇(下·)
13.Label的作用是什么?是怎么用的? label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单事件上. <label for="Name& ...
- ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...
- 从底层角度看ASP.NET-A low-level Look at the ASP.NET...
从更低的角度 这篇文章在一个底层的角度来关注一个web请求怎样到达asp.net框架,从web服务器,通过ISAPI.看看这些后面发生了什么,让我们停止对asp.net的黑箱猜想.ASP.NET是一个 ...
- SecureCRT连接本地的Vmware虚拟机(CentOS)时提示连接超时“Connection timed out”
测试了一下,直接在Vmware的VM里面可以ping通宿主机. 但是宿主机无法ping通VM. 后面发现是本地的网络设置里面的vmware的NAT的网卡设置了手工填写地址和DNS. 修改为自动获取.问 ...
- js中的call()方法与apply()方法
摘自:http://blog.csdn.net/chelen_jak/article/details/21021101 在web前端开发过程中,我们经常需要改变this指向,通常我们想到的就是用cal ...
- 【原创】java NIO selector 学习笔记 一
能力有限,仅仅是自己看源码的一些笔记. 主要介绍 可选通道 和 选择器 选择键(SelectableChannel 和 Selector SelectionKey) 选择器(Selector) 选择 ...
- Invalid bound statement (not found): com.shizongger.chapter2.mapper.UserMapper.insertUser 解决方案
在配置MyBatis时报错信息如下: Invalid bound statement (not found): com.shizongger.chapter2.mapper.UserMapper.in ...
- window.atob()与window.btoa()方法实现编码与解码
window.atob() 与window.btoa() WindowBase64.atob() 函数用来解码一个已经被base-64编码过的数据.你可以使用 window.btoa() 方法来编码一 ...
- 【Python3之字符编码】
一.字符集和字符编码 1.定义 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称 ...
- 关于linux下的date日期,并以日期给文件命名
在linux的终端中,我们输入date后会有以下显示: 然后博主也扩展了一下date的基础用法: date + "%-": %y 输出年份的后2位:%Y 输出完整年份 %m 输出月 ...