BFS PKU3984

2014-11-24 13:26:15 · 作者: · 浏览: 37

题目已经说了有唯一的解,所以只需要在找的过程中保存当前这个点前面的那个的点在队列中的位置

然后再输出的时候运用递归输出就可以了。

迷宫问题
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8238 Accepted: 4848

Description

定义一个二维数组:
int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求 编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  using namespace std; #define MAXN 10 int xx[4]={-1,0,1,0}; int yy[4]={0,1,0,-1}; int vis[MAXN][MAXN]; int map[MAXN][MAXN]; int ans; struct node{ int x,y; int pre; }q[111]; int start=0; int end = 1; void print(int x){ if(q[x].pre != -1){ print(q[x].pre); printf("(%d, %d)\n",q[x].x,q[x].y); } } void BFS(int x,int y){ int i; vis[x][y] = 1; q[start].x = x; q[start].y = y; q[start].pre = -1; while(start < end){ if(q[start].x==4 && q[start].y==4){ print(start); } for(i=0;i<4;i++){ int dx = xx[i] + q[start].x; int dy = yy[i] + q[start].y; if(dx>=0 && dx<5 && dy>=0 && dy<5 && vis[dx][dy]==0 && map[dx][dy]==0){ q[end].x = dx; q[end].y = dy; vis[dx][dy] = 1; q[end].pre = start; end++; } //if(dx==4 && dy==4){ // print(start); //} } start++; } } int main(){ int i,j; for(i=0;i<5;i++){ for(j=0;j<5;j++){ cin>>map[i][j]; } } memset(vis,0,sizeof(vis)); printf("(0, 0)\n"); BFS(0,0); //printf("(4, 4)\n"); return 0; }