POJ 3984 (BFS迷宫)

题目链接:http://poj.org/problem?id=3984

本题应用bfs迷宫就行了,主要是要记录路径,pre数组用于记录路径,这里用了C++的STL,比较方便,当然用数组模拟队列也是可以的,看写bfs的习惯了,下面是AC代码

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<queue>
 5 
 6 using namespace std;
 7 
 8 int map[7][7];
 9 int pre[30],flag[30];
10 int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};   //四个方向
11 
12 bool Isleagal(int r,int c)   //判断点是否合法
13 {
14     if(r<0||r>4||c<0||c>4) return false ;
15     if(map[r][c]==1) return false;
16     return true;
17 }
18 void bfs()    //广搜
19 {
20     int x,r,c,tr,tc,next;
21     queue <int> q;
22     memset(flag,0,sizeof(flag));
23     pre[0]=-1;          //记录点的父亲
24     flag[0]=1;
25     q.push(0);
26     while(!q.empty())
27     {
28         x=q.front();
29         q.pop();
30         r=x/5; c=x%5;      //求出坐标
31         for(int i=0;i<4;i++)
32         {
33             tr=r+dir[i][0];   //按一定方向增加后坐标
34             tc=c+dir[i][1];
35             next=tr*5+tc;
36             if(Isleagal(tr,tc)&&!flag[next])
37             {
38                 pre[next]=x;
39                 if(next==24) return ;    //广搜到终点停止
40                 flag[next]=1;
41                 q.push(next);
42             }
43         }
44     }
45 }
46 
47 void print(int n)   //递归输出结果
48 {
49     if(pre[n]!=-1)
50         print(pre[n]);
51     printf("(%d, %d)\n",n/5,n%5);
52 }
53 
54 int main()
55 {
56     int i,j;
57     for(i=0;i<5;i++)
58     for(j=0;j<5;j++)
59         scanf("%d",&map[i][j]);
60     bfs();
61     print(24);
62     return 0;
63 }

 

posted @ 2013-09-11 21:40  hjf007  阅读(239)  评论(0编辑  收藏  举报