今天继续dfs的训练,遇到了一道神题,不停地TLE,我DD都快碎了。。。。。好在经过本渣不懈努力,还是弄了出来,不容易啊,发上来纪念一下,顺便总结一下关于用dfs解决规定路程的问题。

先上题目:

Description

The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake,
 and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze. 



The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would 
open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly
 the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once 
he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block 
for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him. 
 

Input

The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 
0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give
 the maze layout, with each line containing M characters. A character is one of the following: 



'X': a block of wall, which the doggie cannot enter; 

'S': the start point of the doggie; 

'D': the Door; or 

'.': an empty block. 



The input is terminated with three 0's. This test case is not to be processed. 
 

Output

For each test case, print in one line "YES" if the doggie can survive, or "NO" otherwise. 
 

Sample Input

4 4 5
S.X.
..X.
..XD
....
3 4 5
S.X.
..X.
...D
0 0 0
 

Sample Output

NO
YES
 

附上本渣题解:

//基本思路:通过回溯(即return回来后)把标记的改为未标记的从而得到所有路径
#include<stdio.h>
#include<cstdlib>
int r,c,t,x,y,x1,y1;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char point[7][7];
bool flag;
int count;
int map[7][7];//能够帮助去掉不可能的情况,不用就TLE
void dfs(int x0,int y0,int r,int c,int step)//step记录当前点在当前路径的步数
{
int temp;
temp=count-step-abs(x0-x1)-abs(y0-y1)+1;//通过对当前点和最终点的位置判断当前点有无可能满足条件,不用就TLE
if (temp<0||temp%2==1)//这是通过奇偶判断,数学知识,易忽视。。
return;
for(int i=0;i<4;i++)
{
int tempx=x0+dx[i],tempy=y0+dy[i];
if(point[tempy][tempx]=='D'&&step==count)//判断步数与路径长度是否相同
flag=true;
if(tempx>=0&&tempx<c&&tempy>=0&&tempy<r&&point[tempy][tempx]=='.')
{
point[tempy][tempx]='X';//通过使当前点变为X来标记当前路径是否经过
dfs(tempx,tempy,r,c,step+1);//探索邻接点
point[tempy][tempx]='.';//回溯还原,使其得能够探索全部路径
if(flag==true)//如果存在,就直接返回,不用此判断就TLE。。。
return ;
}
}
return ;
}
int main()
{
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
{
if((i+j)%2)
map[i][j]=0;
else
map[i][j]=1;
}
while(1)
{
scanf("%d%d%d",&r,&c,&t);
getchar();
if(r==0&&c==0&&t==0)
break;
count=t;
for(int i=0;i<r;i++)
{
scanf("%s",point[i]);
}
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
{
if(point[i][j]=='S')
{
y=i;
x=j;
}
else if(point[i][j]=='D')
{
y1=i;
x1=j;
}
}
if(abs(map[y1][x1]-map[y][x])%2!=t%2)//map判断起点终点的位置是否有可能,不用就TLE。。
{
printf("NO\n");
continue;
}
flag=false;
dfs(x,y,r,c,1);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

map的用处:

v可以把map看成这样:
v0 1 0 1 0 1
v1 0 1 0 1 0
v0 1 0 1 0 1
v1 0 1 0 1 0
v0 1 0 1 0 1
v从为 0的格子走一步,必然走向为
1的格子
v从为 1的格子走一步,必然走向为
0的格子
v即:
v0->1或1->0必然是奇数步
v0->0走1->1必然是偶数步 

所以当遇到从 0走向0或从1走向1但是要求时间是奇数的,或者,从1
走向 0
但是要求时间是偶数的都可以直接判断不可达!

所以map表能从一开始就减少可能的情况。

利用dfs解决规定路程问题的更多相关文章

  1. 数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现

    这是我们学校做的数据结构课设,要求分别输出关键路径,我查遍资料java版的只能找到关键路径,但是无法分别输出关键路径 c++有可以分别输出的,所以在明白思想后自己写了一个java版的 函数带有输入函数 ...

  2. 用深度优先搜索(DFS)解决多数图论问题

    前言 本文大概是作者对图论大部分内容的分析和总结吧,\(\text{OI}\)和语文能力有限,且部分说明和推导可能有错误和不足,希望能指出. 创作本文是为了提供彼此学习交流的机会,也算是作者在忙碌的中 ...

  3. 利用闭包解决for循环里onclick事件不能捕捉实时i值问题

    问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...

  4. 利用Readability解决网页正文提取问题

    分享: 利用Readability解决网页正文提取问题   做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...

  5. 利用gulp解决微信浏览器缓存问题

    做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...

  6. 利用Json_encode解决中文问题

    利用Json_encode解决中文问题       public function return_json($data=array()){         echo json_encode($data ...

  7. 利用Filter解决跨域请求的问题

    1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...

  8. 利用NSProxy解决NSTimer内存泄漏问题

    之前写过一篇利用RunTime解决由NSTimer导致的内存泄漏的文章,最近和同事讨论觉得这样写有点复杂,然后发现有NSProxy这么好用的根类,根类,根类,没错NSProxy与NSObject一样是 ...

  9. 利用dynamic解决匿名对象不能赋值的问题

    原文:利用dynamic解决匿名对象不能赋值的问题 关于匿名对象 匿名对象是.Net Framework 3.0提供的新类型,例如: }; 就是一个匿名类,搭配Linq,可以很灵活的在代码中组合数据, ...

随机推荐

  1. Jstree 使用CheckBox插件 选中父节点时被禁用的子节点也会选中问题

    问题描述: 最近用jstree遇到一个问题,使用CheckBox插件时,当父节点选中时,被禁用的子节点也会选中如下 解决方案: 1.  将jstree升级到最新的版本,v3.3.4及以上就可以 2. ...

  2. [数据结构]C语言二叉树的实现

    树和图是数据结构中比较麻烦的东西,里面涉及的概念比较多,也最有用, 就比如一般树广泛应用于人工智能的博弈上,而基于图的广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把树进行分类: &g ...

  3. c#创建access数据库和数据表

      由于在程序中使用了ADOX,所以先要在解决方案中引用之,方法如下: 解决方案资源管理器(项目名称)-->(右键)添加引用-->COM--> Microsoft ADO Ext. ...

  4. 后缀数组之hihocoder 重复旋律1-4

    蒟蒻知道今天才会打后缀数组,而且还是nlogn^2的...但基本上还是跑得过的: 重复旋律1: 二分答案,把height划分集合,height<mid就重新划分,这样保证了每个集合中的LCP&g ...

  5. mysql TIMESTAMP与DATATIME的区别---转载加自己的看法

    from:http://lhdeyx.blog.163.com/blog/static/318196972011230113645715/ from:http://blog.csdn.NET/zht6 ...

  6. ES6 函数的扩展3

    箭头函数 基本用法 ES6允许使用"箭头"(=>)定义函数 var f = v => v; 上面的箭头函数等同于: var f = function(v) { retu ...

  7. Linux第七节随笔-下磁盘管理

    baidubaike 磁盘管理物理磁盘---> RAID--->文件系统--->用户使用LVM概念简述Raid详细解说                0                ...

  8. 30分钟入门Java

    技术只是工具,文档只是说明书,仅此而已. 写在前面 工作4年有余,盲人摸象般的走过弯路,也投机取巧的领悟到过一些类似"编程本质"的东西.现在开始我计划回顾下我的编程生涯.在这里分享 ...

  9. K:java中序列化的两种方式—Serializable或Externalizable

    在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...

  10. python内置函数与匿名函数

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() d ...