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 }