專題一 簡單搜索 Problem K


題目鏈接:http://poj.org/problem?id=3984

題目大意:給定一個5*5的迷宮,其中有的點可走,有的點不可走,問從左上角到右下角所需要的最短步數。

     並記錄下該最短路徑的整個過程。

解題思路:bfs搜索

     由於這道題需要將路徑打印出來,所以用一個結構體描述一點時,不僅需要記錄該點的橫縱坐標,還需要記錄該點的上一個節點的編號。

     從隊首取出一點,向4個方向開始搜索,如果滿足條件,將該點標記為走過,放入隊尾,此時還要記錄它的上一個點(head-1)。

     防止搜索越界。output函數並不打印起點和終點。

代碼如下:

 1 #include<cstdio>
2 #include<cstring>
3
4 int maze[5][5];//描述迷宮
5 struct Point
6 {
7 int x,y,pre;//描述迷宮中的一點,因為要打印路徑,所有需要記錄下來該點的上一個節點
8 };
9 Point Queue[50];//模擬隊列實現過程
10 bool vis[5][5];//標記迷宮中的點是否走過
11
12 void output(int i)//該函數不打印起點(0,0)和終點(4,4)
13 {
14 if(Queue[i].pre!=-1)//遞歸找出每點的上一個點,並輸出其坐標
15 {
16 output(Queue[i].pre);
17 printf("(%d, %d)\n",Queue[i].x,Queue[i].y);
18 }
19 }
20
21 void bfs()
22 {
23 memset(vis,0,sizeof(vis));//初始化標記為均未走過
24
25 int head=0,tail=1;//隊首,隊尾
26 //描述隊首
27 Queue[0].x=Queue[0].y=0;
28 Queue[0].pre=-1;
29 vis[0][0]=1;
30
31 while(head<tail)
32 {
33 Point p=Queue[head++];//從隊首取出一點,拋棄
34
35 if(p.x==4 && p.y==4) output(p.pre);//若該點是終點,則從它的上一點開始打印,直至終點
36
37 //判斷該點是否走過,是否可走,是否處於迷宮中
38 if(p.x+1>=0 && p.x+1<=4 && maze[p.x+1][p.y]==0 && vis[p.x+1][p.y]==0)//向東
39 {
40 vis[p.x+1][p.y]=1;//標記走過
41 Queue[tail].pre=head-1;//因為隊首點已經向下移了一格,所以該點的上一點是此時的隊首-1
42 Queue[tail].x=p.x+1;//將該點放在隊尾
43 Queue[tail++].y=p.y;//將該點放在隊尾
44 }
45 if(p.x-1>=0 && p.x-1<=4 && maze[p.x-1][p.y]==0 && vis[p.x-1][p.y]==0)//向西
46 {
47 vis[p.x-1][p.y]=1;
48 Queue[tail].pre=head-1;
49 Queue[tail].x=p.x-1;
50 Queue[tail++].y=p.y;
51 }
52 if(p.y+1>=0 && p.y+1<=4 && maze[p.x][p.y+1]==0 && vis[p.x][p.y+1]==0)//向南
53 {
54 vis[p.x][p.y+1]=1;
55 Queue[tail].pre=head-1;
56 Queue[tail].x=p.x;
57 Queue[tail++].y=p.y+1;
58 }
59 if(p.y-1>=0 && p.y-1<=4 && maze[p.x][p.y-1]==0 && vis[p.x][p.y-1]==0)//向北
60 {
61 vis[p.x][p.y-1]=1;
62 Queue[tail].pre=head-1;
63 Queue[tail].x=p.x;
64 Queue[tail++].y=p.y-1;
65 }
66 }
67 }
68
69 int main()
70 {
71 for(int i=0;i<5;i++)//讀入迷宮
72 {
73 for(int j=0;j<5;j++)
74 {
75 scanf("%d",&maze[i][j]);
76 }
77 }
78 printf("(0, 0)\n");
79 bfs();
80 printf("(4, 4)\n");
81 return 0;
82 }
View Code

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com