1089: 简单迷宫问题

题目描述

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;
}

你可能感兴趣的:(PIPI,图,数据结构)