逃离迷宫
BFS做法
- 这道题目跟以往的最短路不同,其核心是利用BFS由近及远的特点求出到达目标点的最少拐弯数。
- 如何求出最少的拐弯数?最少拐弯数即意味着,从起点到目标点的路径要尽量直来直往,即在某点选定任意方向后始终沿该方向行走直到不可走。
for(int i = 0;i < 4;i++){
int nx = x + dx[i], ny = y + dy[i];
while(judge(nx,ny)){
// 始终沿着一个方向走
if(!vis[nx][ny]){
...
}
nx += dx[i];
ny += dy[i];
}
}
一开始写的时候把上面的代码写错了,没有搜索全部的状态。
错误代码
for(int i = 0;i < 4;i++){
int nx = x + dx[i], ny = y + dy[i];
while(judge(nx,ny)){
// 这样写遇到已经搜索过的就会停止直走,是错误的。
if(!vis[nx][ny]){
...
nx += dx[i];
ny += dy[i];
}
}
}
AC码
#include <iostream>
#include<queue>
using namespace std;
struct Node {
int x, y;
char d;// 位于该节点的朝向
Node(int a = 0, int b = 0, char c = '/') {
x = a, y = b, d = c;
}
};
char maze[105][105];
int record[105][105];
int vis[105][105];
int dx[] = {
0,-1,0,1 };
int dy[] = {
-1,0,1,0 };
int k, sx, sy, gx, gy, m, n;
void bfs()