欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最短路径(BFS)

程序员文章站 2023-12-24 12:00:27
...

宽度优先搜索

最短路径(BFS)
最短路径(BFS)
*图片来源:挑战程序设计竞赛(第2版)

题目

最短路径(BFS)
最短路径(BFS)
最短路径(BFS)
最短路径(BFS)

最短路径(BFS)

http://m.blog.csdn.net/article/details?id=50768661。

#include <iostream>
#include <queue>
using namespace std;
const int MAX_N = 100;
const int MAX_M = 100;
const int INF = 0x3f3f3f3f;   //用来表示无穷大
typedef pair<int, int> P;   //定义一个坐标形式
char maze[MAX_N][MAX_M + 1];
int N, M;
int sx, sy; //起点的位置
int gx, gy; //终点的位置
 
int d[MAX_N][MAX_M];//储存起点到某一点的距离
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 };  //移动方向
 
void bfs()
{
	queue<P> que;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			d[i][j] = INF;	     //将所有的点置空
	que.push(P(sx, sy));  //输入起点
	d[sx][sy] = 0;	    
 
	while (que.size())   //
	{
		P p = que.front(); que.pop(); //每一队都是一层(累积的距离相等),且只考虑一队
		int i;
		for (i = 0; i < 4; i++)		//输入目前这个点周围四个中没有被访问过的点
		{
			int nx = p.first + dx[i];
			int ny = p.second + dy[i];
			if (0 <= nx&&nx < N
				&& 0 <= ny&&ny < M
				&&maze[nx][ny] != '#'
				&&d[nx][ny] == INF)
		/*如果这个点(那四个点之一)
		1.在这个地图内
		2.这个点不是‘#’(不是墙)
		3.其值等于无穷大(未被访问过)
		*/
			{
				que.push(P(nx, ny));//满足以上条件即可进入队列
				d[nx][ny] = d[p.first][p.second] + 1; //目标位置下移了一次
				if(nx==gx && ny==gy) break;  //到了终点
 
                        }
		}
		if(i!=4) break;
	}
 
}
 
int main()
{
	cin>>N>>M;
	for (int i = 0; i < N; i++)
		cin>>maze[i];
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
		{
			if (maze[i][j] == 'S')
			{
				sx = i; sy = j;
			}
			if (maze[i][j] == 'G')
			{
				gx = i; gy = j;
			}
		}
	bfs();
	cout<<d[gx][gy]<<endl;
 
	return 0;
}

相关标签: 学习 算法

上一篇:

下一篇: