第二章 2.1 DFS POJ 3009:Curling 2.0 (练习题)

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 int w,h;  //h:行 w:列
 8 int sq[25][25];
 9 int sx,sy,gx,gy;  //起点终点
10 int dx[4]={1,-1,0,0};
11 int dy[4]={0,0,1,-1};
12 int result;  //记录最后的结果
13 
14 //在位置(x,y)上,已经走了ans步
15 void dfs(int x,int y,int ans){
16     if(x==gx&&y==gy){ //到达终点
17         if(result>ans){ //若有最小值
18             result = ans;
19         }
20     }
21     //若超过10步,或者超过当前最短步数
22     if(ans==10||ans>=result) return;
23     //往四个方向搜索
24     for(int i=0;i<4;i++){
25         int nx=x+dx[i], ny=y+dy[i];
26         //往某个方向一直走,直到出界或撞墙
27         while(1<=nx&&nx<=h&&1<=ny&&ny<=w&&sq[nx][ny]!=1){
28             if(nx==gx&&ny==gy){ //到达目标
29                 ans++;
30                 if(result>ans)
31                     result = ans;
32                 return;
33             }
34             nx+=dx[i]; ny+=dy[i];
35         }
36         if((nx==x+dx[i]&&ny==y+dy[i])||(nx<1||nx>h||ny<1||ny>w)){
37             continue; //此方向不能走,或出界
38         }
39         //撞墙
40         sq[nx][ny]=0;
41         ans++;
42         dfs(nx-dx[i],ny-dy[i],ans);
43         //回溯
44         sq[nx][ny]=1;
45         ans--;
46     }
47 }
48 
49 void solve(){
50     result = 11;
51     dfs(sx,sy,0);
52     //只有在到达终点的时候才更新result,
53     //result==11说明不能到达
54     if(result==11)
55         printf("-1\n");
56     else
57         printf("%d\n",result);
58 }
59 
60 int main(){
61     while(1){
62         scanf("%d%d",&w,&h);
63         if(w==0&&h==0) break;
64         for(int i=1;i<=h;i++){
65             for(int j=1;j<=w;j++){
66                 scanf("%d",&sq[i][j]);
67                 if(sq[i][j]==2){ sx=i; sy=j; }
68                 if(sq[i][j]==3){ gx=i; gy=j; }
69             }
70         }
71         solve();
72     }
73     return 0;
74 }
posted @ 2019-10-20 21:11  xiongbing  阅读(105)  评论(0)    收藏  举报