今天继续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. iOS Label 自适应高度

    推荐第二个 测试一,只改变numberOfLines属性,label的高度不会自适应(会有text中的一部分内容称为......) NSString *str = @"jgreijgirje ...

  2. Linux下添加源的几种方法

    sudo add-apt-repository  xxxxxxx sudo gedit /etc/apt/sources.list然后把源粘贴进去,保存,最后shell输入sudo apt-get u ...

  3. C语言_第二讲_规范以及常用数据类型

    一丶编码规范基本数据类型 编码规范 任何程序员,都应该有良好的的编码习惯,便于以后的代码可读性和维护 常见了编码规范有 匈牙利命名法 驼峰式大小写 匈牙利命名法: 是电脑程序设计中的一种变量命名规则, ...

  4. magento获取商品的图片

    获取商品的图片主要从catalog_product_entity_media_gallery 表中 该表中各列的属性代表 value_id:记录 ID,可以留空让数据库自动生成. attribute_ ...

  5. JavaScript中的数组对象遍历、读写、排序等操作

    以百度前端技术学院的js任务三为例,复习一下关于js数组的几个点 题目 <!DOCTYPE> <html> <head> <meta charset=&quo ...

  6. 数据库SQL优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. Android:Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

    今天开发Android项目时,导入了http有关架包后,程序编译报错如下: Error:Execution failed for task ':app:transformResourcesWithMe ...

  8. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  9. iOS学习——iOS 整体框架及类继承框架图

    整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...

  10. 房上的猫:java基础知识部分知识点

    1.Java常见的注释有哪些,语法是怎样的? 1)单行注释用//表示,编译器看到//会忽略该行//后的所文本  2)多行注释/* */表示,编译器看到/*时会搜索接下来的*/,忽略掉/* */之间的文 ...