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

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

所以不可以用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. Cat 跨线程之 ForkedTransaction 用法和原理分析

    代码 package com.dianping.cat.message.internal; import com.dianping.cat.Cat; import com.dianping.cat.m ...

  2. C++中double类型的数字如何保留三位小数点详解

    我们知道C语言中,如果要求输出结果保留三位小数,我们可以使用pritf()函数轻松的解决.但是C++的输出运算符<<并没有直接实现这个功能,怎么办呢?之前在找答案的过程中各路大神给出了千姿 ...

  3. 基于Docker的ELK日志平台搭建

    1.安装Docker Docker可简单理解为一个轻量级的虚拟机.Docker对进程进行封装隔离,隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器.Docker和传统虚拟化方式的不同.传统虚拟 ...

  4. C# DataGridView中DataGridViewComboBoxCell列,下拉框事件的处理【完美解决】

    http://blog.csdn.net/a312100321/article/details/25195311 问题:DataGridView绑定数据源之后,有一列需要用下拉框DataGridVie ...

  5. C#用DataTable实现Group by数据统计

    http://www.cnblogs.com/sydeveloper/archive/2013/03/29/2988669.html 1.用两层循环计算,前提条件是数据已经按分组的列排好序的. Dat ...

  6. python实现散列表的链表法

    在散列中,链接法是一种最简单的碰撞解决技术,这种方法的原理就是把散列到同一槽中的所有元素 都放在一个链表中. 链接法有两个定理,定理一: 在简单一致散列的假设下,一次不成功查找的期望时间为O(1 + ...

  7. Centos7上安装使用locate

    centos7上默认没有locate命令,需先安装locate yum install mlocate 注意是mlocate,如果是yum install locate系统会提示没有安装包 安装完成后 ...

  8. Python学习_12_方法和类定制

    方法 在上一篇随笔中,简单提到了类的某些方法:__init__()等的调用,并简要说明方法和函数的区别. 方法是在类内部定义的函数,方法也是对象,所以方法是类的属性,这就是为什么说实例的方法存在于类定 ...

  9. R语言命令行参数

        批量画图任务中,需要在R中传入若干参数,之前对做法是在perl中每一个任务建立一个Rscript,这种方式超级不cool,在群里学习到R的@ARGV调用方式,差不多能够达到批量任务的要求: a ...

  10. java面向对象知识整理(一)

    1.面向对象思想 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对像,强调具备功能的对象. 特点:(1)符合人们思考习惯的一种思想. (2)将复杂的事情简单化 ...