迷宫问题广度优先搜索算法

1

Maze(60分)

题目内容:

給你一個迷宮,

S為起點,E為終點。

請你找出走出迷宮所需要花費的最短步數。

你只能往上下左右四個方向移動。

 

输入格式:

第一行有一個數字T,代表有T組測資。

每組測資的第一行有兩個數字R、C,

代表迷宮的大小(R x C)。

接下來R行,每行有C個字元來描述迷宮,

‘.’代表可以行走的路,

‘X’代表不可行走的牆壁,

‘S’代表起點,

‘E’代表終點。

測資範圍:

T < 100

2 < R,C <= 30

 

输出格式:

對於每組測資,計算由起點到達終點的最少步數。

測資保證一定存在至少一條由起點通往終點的路徑。

將每組測資的步數加總後再輸出。

 

输入样例:

2

5 5

SXXXX

…XX

.X…

..XXX

….E

6 6

……

.S..X.

XXX…

….X.

.X..XX

.EX…

 

输出样例:

18

 

这个就是经典的迷宫问题,用广度优先搜索算法

#include<iostream>
#include<queue>
using namespace std;

bool visited[50][50];        // 查看地图是否被访问
char map[50][50];             // 标记地图
int dx[4] = { 0,1,0,-1 };  // x方向移动路径
int dy[4] = { 1,0,-1,0 };
int n, m;
int starti, startj;
int endi, endj;
struct Node
{
	int i;
	int j;
	int s;     // 起点到当前点的最短路径

};

bool judge(int i, int j)
{
	if (j < 0 || j>=m || i < 0 || i >= n)
		return true;
	if (visited[i][j])
		return true;
	if (map[i][j]=='X')
		return true;

	return false;
}

Node bfs()
{
	queue<Node> q;
	Node cur, next;
	int ni, nj;
	cur.i = starti;
	cur.j = startj;
	cur.s = 0;
	visited[starti][startj] = true;
	q.push(cur);
	while (!q.empty())
	{
		cur = q.front();
		q.pop();
		if (cur.i == endi && cur.j == endj)
			return cur;
		for (int i = 0; i < 4; i++)
		{
			// 四种遍历方法
			ni = cur.i + dx[i];
			nj = cur.j + dy[i];
			if (judge(ni, nj))
			{
				// 如果这种走法不行,尝试下一种走法
				continue;
			}
			// 可以走
			next.i = ni;
			next.j = nj;
			next.s = cur.s + 1;
			q.push(next);
		}

	}
	return cur;
}

int main()
{
	int N;
	cin >> N;
	int sum = 0;
	while (N--)
	{
		cin >> n >> m;
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				cin >> map[i][j];
				if (map[i][j] == 'S')
				{
					starti = i;
					startj = j;
				}

				if (map[i][j] == 'E')
				{
					endi = i;
					endj = j;
				}
			}
		}
		memset(visited, 0, sizeof(visited));
		Node ans = bfs();
		sum += ans.s;
	}
	cout << sum << endl;
}

 

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/wwxy1995/article/details/84635444
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞