PIPI定义了一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,请找出从左上角到右下角的最短路线。
仅一组测试用例。
一个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
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
简单轻松的搜索入门~
代码:
#include
using namespace std;
int maze[5][5];//用数组定义一个5×5的迷宫
int vis[5][5];//访问标记数组
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//方向数组
struct pos{//定义一个结构体表示当前所在的位置坐标
int x;
int y;
}p;
pos pre[5][5];//记录走到终点后,路径上每一个结点的前驱
void dfs(int x,int y){//用dfs反向输出路径
if(x>0||y>0)dfs(pre[x][y].x,pre[x][y].y);
printf("(%d, %d)\n",x,y);
}
void bfs(){
queueq;//定义一个队列用于bfs,存储的数据类型为结构体类型
q.push({0,0});//将初始位置入队
vis[0][0]=1;//将初始位置标记为已经访问
while(!q.empty()){//队列不为空,循环访问
p = q.front();q.pop();
if(p.x==4&&p.y==4) break;//说明到达终点,终点坐标为(4,4) //要先判断是否到达终点,再继续下面的循环判断
for(int i=0;i<4;++i){//循环遍历四个方向,检查是否符合要求
int nx = p.x + dir[i][0];
int ny = p.y + dir[i][1];
if(nx<0||nx>4||ny<0||ny>4||vis[nx][ny]==1) continue;//如果坐标越界或者当前坐标位置已经被访问过,则跳出此次for循环
if(maze[nx][ny]==0){//只有当前位置为0的时候,才可以继续往后走
vis[nx][ny]=1;//标记当前位置已经被访问
q.push({nx,ny});//入队
pre[nx][ny] = p;//记录前驱 p为(nx,ny)变更前的坐标位置
}
}
}
dfs(4,4);
}
int main(){
for(int i=0;i<5;++i){
for(int j=0;j<5;++j){
scanf("%d",&maze[i][j]);
}
}
bfs();
return 0;
}