POJ 3009 深度优先搜索
问题:打冰球。冰球可以往上下左右4个方向走,只有当冰球撞到墙时才会停下来,而墙会消失。当冰球紧贴墙时,不能将冰球往那个方向打。冰球出界就当输,超过10次还没将冰球打到目标位置也当输。求用最小次数将冰球打到目标位置,或输出-1表示输了。
分析:一般来说,求最小步数之类的迷宫问题都是用BFS解决的,但这题涉及到迷宫状态的变化(墙),BFS要不断记录状态的变化很复杂,不过网上好像也有人用BFS做的。DFS更加适合这种状态一直变化的,只不过要保存最优值而已,其实最优值也方便剪枝(当前步数已经是当前最优值大小但还没到达目的地也就没必要进行下去了)。需要注意的是,这题并不是移动一格,而是一直移动直到遇到障碍物。特别是目标点可能在移动的过程中到达。具体看代码。
C++代码:
#include <cstdio> const int MAX_W = ;
const int MAX_H = ; //输入
int W, H;
int g[MAX_H][MAX_W]; //起始
int sx, sy;
//目标
int ex, ey;
//4个方向
int d[][] = {{-, }, {, }, {, -}, {, }};
//最终结果
int result; bool inSquare(int x, int y){
return <= x && x < H && <= y && y < W;
} //在(x, y)位置上的步数ans
void dfs(int x, int y, int ans){
//若到达目标点
if(x == ex && y == ey){
if(result > ans){
//若有更小值
result = ans;
}
return;
}
//若超过10步,或超过当前最短步数
if(ans == || ans >= result) return;
//深度优先4个方向走
for(int i = ; i < ; i ++){
int nx = x + d[i][], ny = y + d[i][];
while(inSquare(nx, ny) && g[nx][ny] != ){
//若此方向能走,则走到尽头,直至出场或撞墙
if(nx == ex && ny == ey){
//若在过程中到达目标点
ans ++;
if(result > ans){
result = ans;
}
return;
}
nx += d[i][];
ny += d[i][];
}
if((nx == x + d[i][] && ny == y + d[i][]) || !inSquare(nx, ny)){
//此方向不能走,或出场
continue;
}
//撞墙
g[nx][ny] = ;
ans ++;
dfs(nx - d[i][], ny - d[i][], ans);
ans --;
g[nx][ny] = ;
}
} void solve(){
//初始化
result = ;
//找出起始点与终点
for(int i = ; i < H; i ++){
for(int j = ; j < W; j ++){
if(g[i][j] == ){
sx = i;
sy = j;
g[i][j] = ;
}
if(g[i][j] == ){
ex = i;
ey = j;
}
}
}
//深度优先搜索
dfs(sx, sy, );
if(result == )
printf("-1\n");
else
printf("%d\n", result);
} int main(int argc, char const *argv[]){ while(scanf("%d %d", &W, &H)){
if(W == && H == ) break;
for(int i = ; i < H; i ++){
for(int j = ; j < W; j ++){
scanf("%d", &g[i][j]);
}
}
solve();
}
return ;
}
POJ 3009 深度优先搜索的更多相关文章
- POJ 1979 深度优先搜索
题意:有红色和黑色的格子,只能走黑色的,问从起始位置出发,最多能走到达多少块黑色格子. 分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个.每次可以走上下 ...
- poj 1164 深度优先搜索模板题
#include<iostream> //用栈进行的解决: #include<cstdio> #include<algorithm> #include<cst ...
- POJ - 1321 深度优先搜索入门
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> us ...
- 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386
DFS入门的一道经典题目:LakeCounting 用栈或队列来实现: #include<cstdio> #include<stdlib.h> #include<iost ...
- POJ 3009
http://poj.org/problem?id=3009 一个搜索的题目: 大意就是一个冰球,在冰面上滑动,你打击一次,就沿一个反向滑动,知道碰到墙就会停下,而墙则会破碎. 求从起点到终点的最短的 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- 初涉深度优先搜索--Java学习笔记(二)
版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...
- 挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386 思路:(⊙v⊙)嗯 和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...
随机推荐
- Spark Streaming与kafka整合实践之WordCount
本次实践使用kafka console作为消息的生产者,Spark Streaming作为消息的消费者,具体实践代码如下 首先启动kafka server .\bin\windows\kafka-se ...
- Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...
- C#关于使用枚举遇到的问题----Parse()方法使用注意
声明了一个枚举 public enum ceshimeiju { 跃动,光子} ceshimeiju ce = Enum.Parse(typeof(ceshimeiju ), "跃动&quo ...
- 5、第5节课CSS补充和html 标签讲解20150924
1. DIV 隐藏 A: 隐藏之后不占位置 display:none; B:隐藏之后占位置 visibility:hidden; 2.DIV 排序 z-index:2; 默认是1,如果想DIV在上 ...
- AngularJs学习html转义
MainApp.directive('ngHtml', function () { function watch(scope, el, watchExp){ scope.$watch(watchExp ...
- 武汉科技大学ACM:1004: Lake and Island
Problem Description 北园孩子的专属福利来啦~学校从北区宿舍到湖心岛修建了一条通道让北园的同学们可以上去一(kuang)同(xiu)玩(en)耍(ai),这一天,IcY向ahm001 ...
- 详解boost库中的Message Queue .
Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...
- 发布一款仿天猫产品放大镜JQuery插件
效果如下图: 1.原图 2.放大镜效果: 插件源码如下: /* * * JQUERY 简洁无极放大镜插件-zoomer * Author:盛世游侠 * QQ:418873053 * Date:2013 ...
- Web 端 js 导出csv文件(使用a标签)
前言 导出文件,使用最多的方式还是服务器端来处理.比如jsp 中使用response 的方式. 但是,有时候可能就想使用web 前端是否也可以把页面上的内容导出来呢? 比如说,导出页面的一个表格. 这 ...
- MySQL新建用户,授权,删除用户,修改密码总结
首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的. 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用. 用户:rdingcn 用户数据库:rdi ...