题目大意就是求在特定规则下的最短路,这个规则包含了消除障碍的操作。用BFS感觉选择消除障碍的时候不同路径会有影响,用DFS比较方便状态的还原(虽然效率比较低),因此这道题目采用DFS来写。

写的第一次提交代码是TLE,原因是忘记总步数>10就应该剪枝的条件。AC代码如下:

 #include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = ;
struct Point{
int r, c;
Point(int r=-, int c=-):r(r),c(c){}
};
Point s,t;
int W,H;
int G[maxn][maxn];
const int dr[] = {,-,,};
const int dc[] = {,,-,};
int ans = ;
void dfs(int r,int c,int k){
if(k >= ) return ;
for(int i = ; i < ; i++){
int nr = r;
int nc = c;
int is_walk = ;
while(G[nr+dr[i]][nc+dc[i]]==){
is_walk=;
nr+=dr[i];
nc+=dc[i];
if(nr == t.r && nc == t.c){
ans = min(ans,k+);
return ;
}
}
if(!is_walk)continue;
if(G[nr+dr[i]][nc+dc[i]] == )continue ;
if(G[nr+dr[i]][nc+dc[i]] == ){
G[nr+dr[i]][nc+dc[i]] = ;
dfs(nr,nc,k+);
G[nr+dr[i]][nc+dc[i]] = ;
}
}
}
int main(){
while(scanf("%d%d ", &W, &H) && (W || H)){
ans = ;
for(int i = ; i <= H; i++){
for(int j = ; j <= W; j++)
scanf("%d",&G[i][j]);
}
for(int i = ; i <= W+; i++)
G[][i] = ,G[H+][i] = ;
for(int i = ; i <= H+; i++)
G[i][] = ,G[i][W+] = ;
for(int i = ; i <= H; i++){
for(int j = ; j <= W; j++){
if(G[i][j] == ){
s = Point(i,j);
G[i][j] = ;
}
else if (G[i][j] == ){
t = Point(i,j);
G[i][j] = ;
}
}
}
dfs(s.r,s.c,);
if(ans != && ans <= )printf("%d\n",ans);
else printf("%d\n",-);
}
return ;
}

poj 3009 (深搜求最短路)的更多相关文章

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

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

  2. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  3. poj 3009 Curling 2.0

    题目来源:http://poj.org/problem?id=3009 一道深搜题目,与一般搜索不同的是,目标得一直往一个方向走,直到出界或者遇到阻碍才换方向. 1 #include<iostr ...

  4. POJ 3009

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

  5. POJ 3009 Curling 2.0 回溯,dfs 难度:0

    http://poj.org/problem?id=3009 如果目前起点紧挨着终点,可以直接向终点滚(终点不算障碍) #include <cstdio> #include <cst ...

  6. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  7. poj 3216 Repairing Company(最短路Floyd + 最小路径覆盖 + 构图)

    http://poj.org/problem?id=3216 Repairing Company Time Limit: 1000MS   Memory Limit: 131072K Total Su ...

  8. POJ 3259 Wormholes(最短路,判断有没有负环回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 24249   Accepted: 8652 Descri ...

  9. poj 3009 Curling 2.0( dfs )

    题目:http://poj.org/problem?id=3009 参考博客:http://www.cnblogs.com/LK1994/ #include <iostream> #inc ...

随机推荐

  1. [SHELL]软件管理

  2. jq ajax 传递数组 后台php 接值处理

    //jq数组 var arr = [1,2,3]; //把数组转换为json ajax 传递参数的时候不能直接传递数组 转换为json 可直接传递 var datas = JSON.stringify ...

  3. 部署laravel项目

    1 先登录到服务器上,将代码克隆下来 git clone 项目地址 2 避免composer太慢,启用本镜像服务 可以先安装 apt-get install zip,unzip,php7.0-zip ...

  4. I2C驱动

    在I2C总线驱动下,也是硬件设备和驱动分离,使以就需要通过它们的名字来匹配,这样驱动的probe函数才能被调用 查看linux内核的Documents目录下的说明文件,可知构造i2c设备有4种方法: ...

  5. python学习——模块和包

    在之前常用模块中我们已经初步了解了模块的导入,今天来说学习一下模块和包.我们可以把模块理解成每一个python文件.而包就是多个能解决一类问题的python文件全部放在一起.OK

  6. player视频.js

    var playStatus = 'pending'; var html_a = '<div class="weui-dialog__bd" id="lly_dia ...

  7. for循环删除列表中元素遇到的漏删的问题(python)

    问题描述:python中通过for循环来删除列表中的两个相邻的元素,存在漏删的问题 比如说下面的例子,准备删掉2和3,但是结果是2删掉了,3没删掉 是因为把2删掉后3的下标就变成了1,但是原本下标为1 ...

  8. 实验6 shell程序设计一(2)

    编写一段bash shell程序, 根据键盘输入的学生成绩,显示相应的成绩登等级, 其中 60分以下为"Failed!", 60-69分为"Passed!", ...

  9. 24-集成ASP.NETCore Identity采用EF

    1-增加IdentityServer4.AspNetIdentity nuget包 2- StartUp.cs启用增加相应的代码  .AddAspNetIdentity<ApplicationU ...

  10. MongoDB入门---文档操作之增删改

    之前的两篇文章,已经分享过关于MongoDB的集合还有数据库的各种操作,接下来就涉及到最主要的喽,那就是数据方面的操作,在这里叫做文档操作.话不多说,大家来看正文.     首先来看一下它的数据结构: ...