hdoj--1010<dfs+奇偶剪枝>
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010
题目描述:在n*m的矩阵中,有一起点和终点,中间有墙,给出起点终点和墙,并给出步数,在该步数情况下走到终点,走过的点不能再走;
题目要点:dfs+奇偶剪枝;输入;
本题用dfs可以做出结果,但是会超时,需要用到就剪枝,来减去大部分的可能;
奇偶剪枝:
方格中起点(tx,ty)和终点(dx, dy)最小步骤是minstep=abs(tx-dx)+abs(ty-dy);
给定步数t,从起点走到终点,如果t < minstep,不可以,如果t =minstep,一部也没有多走,如果t> minstep,则多走了extra步,extra=t-minstep;
经过推导可以证明多走的一定是偶数步,即extra一定是偶数。
现在,如果已经走了n步,到达了(x,y)的位置,现在距离终点最小距离是L=abs(x-dx)+abs(y-dy); 现在还可以走的是 t - n 步,如果(t-n)<0,则不能走到地方,如果(t- n)-L 是奇数,则无法多走出偶数步到达指定位置,所以这样的是不行的;
同时,本题时间卡的比较紧,使用dfs事实上是构造可行方案树,有m步最后就有2^m个叶子,所以在进入下一层dfs之前判断是否可行可以减少一大部分叶子;
代码如下:

#include<iostream>
#include<math.h> using namespace std;
int n,m,t,k,dx,dy;
int p,q,tm;
int dir[][]={{-,},{,},{,},{,-}};//构建位置数组,遍历周围四个点;
char a[][];
void dfs(int x,int y,int count)
{
int temp;
temp=t-count-abs(dx-x)-abs(dy-y);
if(temp<||temp%==) //判断是否有偶数步,没有就退出;
return ; int tx,ty;
for(int i=;i<;i++) //循环遍历周围的四个结点,先预判是否超出边界,然后判断是否找到结果,如果找到就不用在进去了;
{
tx=x+dir[i][];
ty=y+dir[i][];
if(a[tx][ty]=='D'&&count==t-)
{
k=;
return ;
}
if(a[tx][ty]=='.'&&(tx>=&&tx<n)&&(ty>=&&ty<m))
{
a[tx][ty]='X';
dfs(tx,ty,count+);
a[tx][ty]='.';
if(k==) //如果没有确定的结果就进去dfs,出来后判断是否有结果了,这样可以减少dfs的步骤;
return ;
}
} }
int main()
{
while(cin>>n>>m>>t&&n!=||m!=||t!=)
{
tm=;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
cin>>a[i][j];
if(a[i][j]=='S')
{
p=i;q=j;
}
if(a[i][j]=='D')
{
dx=i;dy=j;
}
if(a[i][j]=='X')
tm++;
}
}
k=;
if(n*m-tm<=t) //开始判断是否有足够的空来走,没有就直接跳过dfs;
{
printf("NO\n");
continue;
}
dfs(p,q,);
if(k==)
printf("YES\n");
else
printf("NO\n");
}
return ;
}
顺便贴几个dfs的题目
hdoj: 1010 1015 1016 1045 1175 1181 1241 1272 1421 1455 1518 1728
hdoj--1010<dfs+奇偶剪枝>的更多相关文章
- HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意: 输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四 ...
- hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1010:Tempter of the Bone(DFS + 奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- 杭电1010(dfs + 奇偶剪枝)
题目: The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked ...
- HDU 1010:Tempter of the Bone(DFS+奇偶剪枝+回溯)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu1010Tempter of the Bone(dfs+奇偶剪枝)
题目链接:pid=1010">点击打开链接 题目描写叙述:给定一个迷宫,给一个起点和一个终点.问是否能恰好经过T步到达终点?每一个格子不能反复走 解题思路:dfs+剪枝 剪枝1:奇偶剪 ...
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Tempter of the Bone(dfs+奇偶剪枝)题解
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- M - Tempter of the Bone(DFS,奇偶剪枝)
M - Tempter of the Bone Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
随机推荐
- lwz程序人生之启程
本人14年小本科毕业. 第一次接触电脑是小学4年级.当时,是小学公开课,老师让我们去电脑室秀一下.现在,我都记不得当时我第一次看到电脑室好奇呢?还是没感觉呢? 到初中上电脑课的时候,我才真正了解到电脑 ...
- appium---AndroidSdk安装
AndroidSDK指的是Android专属的软件开发工具包,被软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合.Android又是采用java语言进行开发 ...
- javaweb基础(5)_servlet原理
一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...
- DB2中创建表
CONNECT TO TEST; CREATE TABLE DB2ADMIN.PERSON ( ID BIGINT NOT NULL , NAME BIGINT , FLAG BIGINT , ADD ...
- C# 使用Epplus导出Excel [4]:合并指定行
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- kvm笔记
1 virt-manager安装虚拟机无法使用键盘解决 今天远程用VNC登录服务器安装虚拟机,结果使用virt-manager安装虚拟机后在初始阶段无法使用键盘设置,这不雪崩了,后来来回试,找到了原因 ...
- 【费用流】 ICPC 2016 China Final J. Mr.Panda and TubeMaster
表示“必须选”的模型 题目大意 题目分析 一个格子有四种方式看上去很难处理.将横竖两个方向分开考虑,会发现:因为收益只与相邻格子是否连通有关,所以可以将一个格子拆成表示横竖两个方向的,互相独立的点. ...
- (66)zabbix导入/导出配置文件
通过导入/导出zabbix配置文件,我们可以将自己写好的模板等配置在网络上分享,我们也可以导入网络上分享的配置文件 配置文件有两种格式,分为为xml与json,通过zabbix管理界面可以导出xml, ...
- 分享几个简单的技巧让你的 vue.js 代码更优雅
1. watch 与 computed 的巧妙结合 一个简单的列表页面. 你可能会这么做: created(){ this.fetchData() }, watch: { keyword(){ thi ...
- thinkcmf常用标签
1.图片地址:{:cmf_get_image_url($vo.icon)} 2.模板控件 模板变量调用:$theme_vars.title <widget name="aboutUs& ...