走迷宫 BFS

《走迷宫 BFS》
《走迷宫 BFS》

  1 /*一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1来表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上下左右移动到相邻单元格.任何时候会都不能在障碍格中,也不能走到迷宫之外,起点和终点保证是空地.n,m<=100.
  2 
  3 思路很简单:不断沿着父亲指针走,保存方向序列dir,最后反向输出.不能用递归,要用递归会出现栈溢出的现象,所以把dir数组声明成全局变量.
  4 
  5 代码如下:*/
  6 
  7 #include <iostream> 
  8 
  9 #include <queue>
 10 
 11 using namespace std ;
 12 
 13 const int MAXN = 105 ;
 14 
 15 int dx[] = {-1,1,0,0} ;
 16 
 17 int dy[] = {0,0,-1,1} ;
 18 
 19 char name[] = "UDLR" ;
 20 
 21 int n , m , nx , ny ;
 22 
 23 int maze[MAXN][MAXN] , vis[MAXN][MAXN] , fa[MAXN][MAXN] , dist[MAXN][MAXN] , last_dir[MAXN][MAXN] ;
 24 
 25 queue<int> q ;
 26 
 27 void Bfs(int x , int y)
 28 
 29  {
 30 
 31  int u ;
 32 
 33  u = m*x+y ;
 34 
 35  vis[x][y] = 1 ;
 36 
 37  dist[x][y] = 0 ;
 38 
 39  fa[x][y] = u ;
 40 
 41  q.push(u) ;
 42 
 43  while (!q.empty())
 44 
 45  {
 46 
 47   u = q.front() ;
 48 
 49   q.pop() ;
 50 
 51   x = u/m ;
 52 
 53 y = u%m ;
 54 
 55   for (int i = 0 ; i < 4 ; ++ i)
 56 
 57   {
 58 
 59    nx = x+dx[i] ;
 60 
 61 ny = y+dy[i] ;
 62 
 63    if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] && !vis[nx][ny])
 64 
 65    {   
 66 
 67   int v = nx * m + ny ;
 68 
 69     vis[nx][ny] = 1 ;
 70 
 71     fa[nx][ny] = u ;  
 72 
 73    dist[nx][ny] = dist[x][y] + 1 ;
 74 
 75     q.push(v) ;  
 76 
 77    last_dir[nx][ny] = i ;
 78 
 79    }
 80 
 81   }
 82 
 83  } 
 84 
 85 }
 86 
 87 void Print_path(int x , int y)
 88 
 89  {
 90 
 91  int fx = fa[x][y]/m ;
 92 
 93  int fy = fa[x][y]%m ;
 94 
 95    if (fx != x || fy != y)
 96 
 97  {
 98 
 99   Print_path(fx,fy) ;
100 
101   cout << name[last_dir[x][y]] ;
102 
103  }
104 
105 }
106 
107 int dir[MAXN*MAXN] ;
108 
109 void Print_path2(int x , int y)
110 
111  {
112 
113  int c = 0 ;
114 
115  while (true)
116 
117  {  
118 
119 int fx = fa[x][y]/m ;
120 
121   int fy = fa[x][y]%m ;
122 
123   if (fx == x && fy == y)
124 
125   {
126 
127    break ;
128 
129   }
130 
131   dir[c++] = last_dir[x][y] ;
132 
133   x = fx ;
134 
135   y = fy ;
136 
137  }
138 
139  while (c--)
140 
141  {  
142 
143 cout << name[dir[c]] ;
144 
145  }
146 
147 }
148 
149 int main()
150 
151  {
152 
153  int i , j ;  
154 
155 int xs,ys,xt,yt ;
156 
157    cin >> n >> m >> xs >> ys >> xt >> yt ;
158 
159  for (i = 0 ; i < n ; ++ i)
160 
161  {
162 
163   for (j = 0 ; j < m ; ++ j)
164 
165   {  
166 
167   cin >> maze[i][j] ;  
168 
169 }
170 
171  }
172 
173  memset(vis,0,sizeof(vis)) ;
174 
175  Bfs(xs,ys) ;  
176 
177 Print_path(xt,yt) ;
178 
179  cout << endl ;
180 
181  return 0 ;
182 
183 }

View Code

 

    原文作者:BFS
    原文地址: https://www.cnblogs.com/LOB104-zhanglei/articles/3182563.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞