您的位置:首页 > 其它

poj 3009 (深搜求最短路)

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

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

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 22;
struct Point{
int r, c;
Point(int r=-1, int c=-1):r(r),c(c){}
};
Point s,t;
int W,H;
int G[maxn][maxn];
const int dr[] = {1,-1,0,0};
const int dc[] = {0,0,-1,1};
int ans  = 100000;
void dfs(int r,int c,int k){
if(k >= 10) return ;
for(int i = 0; i < 4; i++){
int nr = r;
int nc = c;
int is_walk = 0;
while(G[nr+dr[i]][nc+dc[i]]==0){
is_walk=1;
nr+=dr[i];
nc+=dc[i];
if(nr == t.r && nc == t.c){
ans = min(ans,k+1);
return ;
}
}
if(!is_walk)continue;
if(G[nr+dr[i]][nc+dc[i]] == 4)continue ;
if(G[nr+dr[i]][nc+dc[i]] == 1){
G[nr+dr[i]][nc+dc[i]] = 0;
dfs(nr,nc,k+1);
G[nr+dr[i]][nc+dc[i]] = 1;
}
}
}
int main(){
while(scanf("%d%d ", &W, &H) && (W || H)){
ans  = 100000;
for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++)
scanf("%d",&G[i][j]);
}
for(int i = 0; i <= W+1; i++)
G[0][i] = 4,G[H+1][i] = 4;
for(int i = 0; i <= H+1; i++)
G[i][0] = 4,G[i][W+1] = 4;
for(int i = 1; i <= H; i++){
for(int j = 1; j <= W; j++){
if(G[i][j] == 2){
s = Point(i,j);
G[i][j] = 0;
}
else if (G[i][j] == 3){
t = Point(i,j);
G[i][j] = 0;
}
}
}
dfs(s.r,s.c,0);
if(ans != 100000 && ans <= 10)printf("%d\n",ans);
else printf("%d\n",-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: