问题:打冰球。冰球可以往上下左右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 深度优先搜索的更多相关文章

  1. POJ 1979 深度优先搜索

    题意:有红色和黑色的格子,只能走黑色的,问从起始位置出发,最多能走到达多少块黑色格子. 分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个.每次可以走上下 ...

  2. poj 1164 深度优先搜索模板题

    #include<iostream> //用栈进行的解决: #include<cstdio> #include<algorithm> #include<cst ...

  3. POJ - 1321 深度优先搜索入门

    #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> us ...

  4. 深度优先搜索初尝试-DFS-LakeCounting POJ No.2386

    DFS入门的一道经典题目:LakeCounting 用栈或队列来实现: #include<cstdio> #include<stdlib.h> #include<iost ...

  5. POJ 3009

    http://poj.org/problem?id=3009 一个搜索的题目: 大意就是一个冰球,在冰面上滑动,你打击一次,就沿一个反向滑动,知道碰到墙就会停下,而墙则会破碎. 求从起点到终点的最短的 ...

  6. 深度优先搜索(DFS)

    [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...

  7. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  8. 初涉深度优先搜索--Java学习笔记(二)

    版权声明: 本文由Faye_Zuo发布于http://www.cnblogs.com/zuofeiyi/, 本文可以被全部的转载或者部分使用,但请注明出处. 上周学习了数组和链表,有点基础了解以后,这 ...

  9. 挑战程序2.1.4 穷竭搜索>>深度优先搜索

      深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386  思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...

随机推荐

  1. seq2sparse(4)之PartialVectorMergeReducer源码分析

    继前篇blogseq2sparse(3)之TFParitialVectorReducer源码分析 之后,继续分析下面的代码,本次分析的是PartialVectorMergeReducer的源码,这个r ...

  2. shell 中条件判断

    if 中的 -z 到 -d 的意思 2011-09-05 10:30 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [  ...

  3. 在公网(internet)上建立website时不能用http访问

    我们在internet的IDC提供的虚拟机上建了新的web site, 域名也从阿里巴巴那里得到二级域名,也经过映射到了虚机的IP, 在本机都可以用域名以Http方式访问,但在internet上的其它 ...

  4. Phonegap 版本minSdkVersion为8的时候的自动更新与升级

    清单文件中: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/> ...

  5. .net 文件下载方法

    public void DownLoadMethod(string FilePath)        {            string hzm = Path.GetExtension(FileP ...

  6. Cacti监控Linux主机

    1 要监视一台Linux主机,需要在被监控的主机上安装net-snmp相关软件包,CentOS安装可使用“yum -y install net-snmp”命令:# yum -y install net ...

  7. (一)Angularjs - 入门

    AngularJS进行应用开发的一个重要的思维模式: 从构造声明式界面入手 ng-app: 这个指定定义并且关联了使用angularJS的HTML页面部分 ng-model: 这个指定定义并绑定Ang ...

  8. 2013 多校联合2 D Vases and Flowers (hdu 4614)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  9. 多线程09-Lock和Condition

    1.概念 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象.两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象. 2. ...

  10. Nginx log

    ngx_http_log_module 模块通过指定的格式把请求写入日志.请求登陆到location处理结束的环境中.如果重定向发生在请求处理过程中,这或许与location原理不同. Example ...