HDOJ(1010)DFS+剪枝
Tempter of the Bone
http://acm.hdu.edu.cn/showproblem.php?pid=1010
#include <stdio.h>
#include <stdlib.h>
char map[][];
int dx[]={,,-,};
int dy[]={,,,-};
bool flag;
int n,m,xd,yd,t; void DFS(int x,int y,int t)
{
if(t==) //到时间了符合条件flag=true再退出,不符合条件直接退出。
{
if(x==xd&&y==yd)
flag=true;
return;
}
int temp=abs(x-xd)+abs(y-yd)-t;
if(temp>||temp&) //temp&1相当于temp%2,但是temp%2会超时,位运算比较快
return; //奇偶性剪枝+最小步数大于时间剪枝
if(flag)
return; //找到解后还有部分在继续搜索,这句是为了让其它搜索停止
int i;
int next_x,next_y;
for(i=;i<;i++)
{
next_x=x+dx[i];
next_y=y+dy[i];
if(next_x>=&&next_x<=m&&next_y>=&&next_y<=n&&map[next_y][next_x]!='X')
{
map[next_y][next_x]='X';
DFS(next_x,next_y,t-);
map[next_y][next_x]='.'; //回溯,如果搜不到D,还要恢复成原来的路径
}
}
} int main()
{
int i,j;
int x,y;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==&&m==&&t==)
break;
int wall=;
for(i=;i<=n;i++)
{
scanf("%s",map[i]+); //尽量用%s, %c容易出错
for(j=;j<=m;j++)
{
if(map[i][j]=='S')
{
x=j;
y=i;
}
if(map[i][j]=='D')
{
xd=j;
yd=i;
}
if(map[i][j]=='X')
wall++;
}
}
if(n*m-wall<=t) //可以走的格子比时间少,直接剪掉
printf("NO\n");
else
{
flag=false;
map[y][x]='X';
DFS(x,y,t);
if(flag)
printf("YES\n");
else
printf("NO\n");
} }
return ;
}
深度优先搜索(DFS):解决迷宫问题(比如:能否逃离迷宫,只要判断能不能)
递归式基本框架:(不同的深搜代码千变万化)
void dfs(int si,int sj,int t) //si,sj为起始位置X行Y列坐标
{
int i;
if(si==di&&sj==dj&&t>=) // di,dj为目标位置,t为剩余时间,k为标记符号,可以就k=1
k=; // 能否在t时间内移动到坐标(di,dj)位置(逃离迷宫)?
if(si>=n||si<||sj>=m||sj<)
return; //防止走到地图外面去
if(k)
return; //终止条件,找到能出去的方法就直接return,不执行下面语句
for(i=;i<;i++) //dir[4][2]={1,0,0,1,-1,0,0,-1} 表示方向 :上下左右
{
if(map[si+dir[i][]][sj+dir[i][]]!='X')
{
map[si+dir[i][]][sj+dir[i][]]='X'; //把走过的地方标记成 X,防止又往回走,
//(走来走去就死循环啦!)
dfs(si+dir[i][],sj+dir[i][],t-); // 递归,进一步搜索下去
map[si+dir[i][]][sj+dir[i][]]='.'; //用回溯法,如果上面的深搜失败,就把图还原到原来的状态
}
}
}
广度优先搜索(BFS):适用解决最优解问题 (如:用时最少;代价最优;)
核心代码框架:
while(队列不为空)
{
node temp=Q.front();
//从该结点状态转移到其他状态
for(int i=;i<;i++) //int go[4][2] = {1,0,-1,0,0,1,0,-1}; 上下左右
{
int x=temp.x+go[i][];
int y=temp.y+go[i][];
int t=temp.t+;
//有选择的选择未出现过的状态入队 (用到哈希法,不明白的就百度一下 hash 吧)
if(hash[x][y]==false&&该点可行的条件)
{
if(x==dx&&y==dy) // 判断该状态是否为目的状态
return t;
hash[x][y]=true;
Q.push(newnode(x,y,t));
}
}
Q.pop(); // 弹出队列头结点
}
HDOJ(1010)DFS+剪枝的更多相关文章
- Tempter of the Bone HDU 1010(DFS+剪枝)
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- HDOj 1010 DFS优化
#include<cstdio> #include<cstring> ]={,,,-}; ]={,,-,}; ][]; int x1,y1,x2,y2; int step; i ...
- HDOJ.1010 Tempter of the Bone (DFS)
Tempter of the Bone [从零开始DFS(1)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1010 Tem ...
- DFS+剪枝 HDOJ 5323 Solve this interesting problem
题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- *HDU1455 DFS剪枝
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- POJ 3009 DFS+剪枝
POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...
- poj 1724:ROADS(DFS + 剪枝)
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10777 Accepted: 3961 Descriptio ...
- DFS(剪枝) POJ 1011 Sticks
题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- ionic-native-transitions调用原生页面切换实现ionic路由切换
废话不多说:ionic-native-transitions调用原生页面切换实现ionic路由切换,从而大大提升ionic应用的性能. ionic-native-transitions是一个ionic ...
- CheckBoxList 用法
<asp:CheckBoxList ID="cblqf" ForeColor="#4d6fc8" runat="server" Rep ...
- 通过SSH远程使用ipython notebook
本文讲述如何在本地用浏览器运行远程服务器上的iPython notebook服务. 在远程机器上,启动IPython notebooks服务: remote_user@remote_host$ ipy ...
- Java初学者入门应该掌握的30个概念
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...
- 【转载】开发备必:WEB前端开发规范文档
规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必 须按本文档规范进行前台页面开发. 本文档如有不对或者 ...
- RabbitMQ、ActiveMQ和ZeroMQ
消息中间件的技术选型心得-RabbitMQ.ActiveMQ和ZeroMQ 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs RabbitMQ.Active ...
- oracle 如何查询过去某个时间点的记录(应用于某个时间点的误操作,回滚到之前的操作)
这个功能是在自己误操作,将某些数据更改错了,你想恢复更改错之前的数据,这个时候你可以使用这种方式 不过建议要小心更改数据,如果实在有必要去更新,请先备份数据表,不到万不得以才可以这么做. SE ...
- WeX5学习笔记-建立项目且从SVN获取版本
UI2项目(app项目)建立步骤: 1.从网上获得WeX5_V3.1.1.zip 文件,在某盘根目录下,创建一个文件,起名尽量短小,因开发包里的文件目录层次很深,有时会报路径长度超出范围的提示,如创建 ...
- 样例20-汽车SHOW
观看样例点这里 素材下载 1.设置场景大小为400*3002.执行:文件->导入->导入到库,选择需要的汽车图片文件,将其导入到库面板中3.按照同样的方式,在库面板中导入所需的背景音乐文件 ...
- oracle11g rac修改归档
oracle11g归档日志可以放在本地.共享存储或ASM磁盘,本次修改放在本地盘中 1.创建归档所需要的路径 节点1: mkdir /arch1 chown -R oracle:oinstall /a ...