广度优先搜索——迷宫最短路径

/*
* problem:迷宫的最短距离
* method:广度优先搜索
* date:2020/04/07
*/
#include<iostream>
#include<utility>
#include<queue>
using namespace std;
typedef pair<int,int> P;//坐标
const int INF = 10e8;
const int MAX_N=20,MAX_M=20;
int n,m;//迷宫大小
char maze[MAX_N][MAX_M];//迷宫
int d[MAX_N][MAX_M];//起点到该点的最短距离
P s,g;//起点、终点
int dx[4]= {1,0,-1,0},dy[4]= {0,1,0,-1}; //四个方向
int bfs() {
	queue<P> que;
//初始化d
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
			d[i][j]=INF;
	d[s.first][s.second]=0;
	que.push(s);
	while(que.size()) {
		P p=que.front();
		que.pop();
		if(p.first==g.first&&p.second==g.second) break;
		for(int i=0; i<4; i++) {
			for(int j=0; j<4; j++) {
				int nx=p.first+dx[i],ny=p.second+dy[i];
				if(nx>=0&&ny>=0&&nx<n&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==INF) {
					que.push(P(nx,ny));
					d[nx][ny]=d[p.first][p.second]+1;
				}
			}
		}
	}
	return d[g.first][g.second];
}
void back(int res) {
	P p=g;
	while(res!=1) {
		res--;
		for(int i=0; i<4; i++) {
			int nx=p.first+dx[i],ny=p.second+dy[i];
			if(nx>=0&&ny>=0&&nx<n&&ny<m&&maze[nx][ny]!='#'&&d[nx][ny]==res) {
				maze[nx][ny]='*';
				p=P(nx,ny);
			}
		}
	}
}
int main() {
	cout<<"请输入迷宫的长、宽:";
	cin>>n>>m;
	cout<<"请输入迷宫('#'代表墙,'S'表示起点,'G'表示终点:):"<<endl;
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++) {
			cin>>maze[i][j];
			if(maze[i][j]=='S') s=P(i,j);
			else if(maze[i][j]=='G') g=P(i,j);
		}
	int res = bfs();
	cout<<"最短路径长为"<<res<<endl;
	back(res);
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++)
			cout<<maze[i][j];
		cout<<endl;
	}
	return 0;
}
/*
测试迷宫
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
*/

猜你喜欢

转载自blog.csdn.net/The_Only_God/article/details/105833726
今日推荐