利用dfs解决规定路程问题
今天继续dfs的训练,遇到了一道神题,不停地TLE,我DD都快碎了。。。。。好在经过本渣不懈努力,还是弄了出来,不容易啊,发上来纪念一下,顺便总结一下关于用dfs解决规定路程的问题。
先上题目:
Description
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
Input
'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
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的用处:
1的格子
0的格子
所以当遇到从 0走向0或从1走向1但是要求时间是奇数的,或者,从1
走向 0
但是要求时间是偶数的都可以直接判断不可达!
所以map表能从一开始就减少可能的情况。
利用dfs解决规定路程问题的更多相关文章
- 数据结构:关键路径,利用DFS遍历每一条关键路径JAVA语言实现
这是我们学校做的数据结构课设,要求分别输出关键路径,我查遍资料java版的只能找到关键路径,但是无法分别输出关键路径 c++有可以分别输出的,所以在明白思想后自己写了一个java版的 函数带有输入函数 ...
- 用深度优先搜索(DFS)解决多数图论问题
前言 本文大概是作者对图论大部分内容的分析和总结吧,\(\text{OI}\)和语文能力有限,且部分说明和推导可能有错误和不足,希望能指出. 创作本文是为了提供彼此学习交流的机会,也算是作者在忙碌的中 ...
- 利用闭包解决for循环里onclick事件不能捕捉实时i值问题
问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题, ...
- 利用Readability解决网页正文提取问题
分享: 利用Readability解决网页正文提取问题 做数据抓取和分析的各位亲们, 有没有遇到下面的难题呢? - 如何从各式各样的网页中提取正文!? 虽然可以用SS为各种网站写脚本做解析, 但是 ...
- 利用gulp解决微信浏览器缓存问题
做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...
- 利用Json_encode解决中文问题
利用Json_encode解决中文问题 public function return_json($data=array()){ echo json_encode($data ...
- 利用Filter解决跨域请求的问题
1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery ...
- 利用NSProxy解决NSTimer内存泄漏问题
之前写过一篇利用RunTime解决由NSTimer导致的内存泄漏的文章,最近和同事讨论觉得这样写有点复杂,然后发现有NSProxy这么好用的根类,根类,根类,没错NSProxy与NSObject一样是 ...
- 利用dynamic解决匿名对象不能赋值的问题
原文:利用dynamic解决匿名对象不能赋值的问题 关于匿名对象 匿名对象是.Net Framework 3.0提供的新类型,例如: }; 就是一个匿名类,搭配Linq,可以很灵活的在代码中组合数据, ...
随机推荐
- kvm 随笔
1. 查看kvm虚拟机状态 # virsh list --all 2. KVM虚拟机开机 # virsh start windows 3. KVM虚拟机关机或断电 (1) 关机 virsh关机 ...
- lesson - 11 课程笔记
一.sed 作用: sed 是一种流编辑器,它是文本处理中非常重要的工具, 能够完美的配合正则表达式使用.处理时,把当前处理的行存储在临时缓冲区中, 称为“模式空间(pattern space)”, ...
- tar --打包和压缩
tar 参考链接 作用:为linux的文件和目录创建档案,也可以在档案中改变文件,或者向档案中加入新的文件即用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 语法:tar[必要参 ...
- Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块
Python第二十二天 stat模块 os.chmod方法 os.stat方法 pwd grp模块 stat模块描述了os.stat(filename)返回的文件属性列表中各值的意义,根据 ...
- Java学习笔记-嵌套类
嵌套类 嵌套类有两种类别:static and non-static,分别对应为静态嵌套类和内部类. class OuterClass { ... static class StaticNestedC ...
- linux上配置bochs,搭建基于X86架构操作系统的开发环境
学习操作系统最好的方法就是自己编写新的操作系统,或者修改已有的操作系统.但是如果在真机上完成这个过程,调试会成为一个很大的问题.利用虚拟机来完成,可以使调试过程变得简单,而且能节约很多开关机的时间. ...
- 使用Tomcat的Reload提高开发速度(翻译)
欢迎转载http://www.cnblogs.com/coodream2009,有翻译的不太准确的地方请大家指出,我继续修改完善. 按照Java Servlet规范第四部分推荐的,Tomcat系统的实 ...
- Python多线程编程(第二篇)
一.Python中的上下文管理器(contextlib模块) 上下文管理器的任务是:代码块执行前准备,代码块执行后收拾 1.如何使用上下文管理器: 如何打开一个文件,并写入"hello wo ...
- Qt 地址薄 (二) 添加地址
在上一篇 Qt 地址薄 (一) 界面设计 中,主要是实现了地址簿的界面,使用布局管理器进行元素的布局,并解释了"子类化" 和"所有权"的概念. 本篇将在上面的基 ...
- Java关于BufferedWriter.newline()换行的注意事项
最近项目中需要导出文件,其实导出文件是一个挺简单的事情.但是却遇到了很奇怪的问题. 首先导出到文件需要用到 BufferedWriter.而换行则是通过 bw.newline() 方法,问题将出在 n ...