【每日打卡】Day23:迷宫最短路径(BFS) C++实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40184885/article/details/90183623

题目描述

小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程。
小明只能向上下左右四个方向移动。

输入

输入包含多组测试数据。输入的第一行是一个整数T,表示有T组测试数据。
每组输入的第一行是两个整数N和M(1<=N,M<=100)。
接下来N行,每行输入M个字符,每个字符表示迷宫中的一个小方格。
字符的含义如下:
‘S’:起点
‘E’:终点
‘-’:空地,可以通过
‘#’:障碍,无法通过
输入数据保证有且仅有一个起点和终点。

输出

对于每组输入,输出从起点到终点的最短路程,如果不存在从起点到终点的路,则输出-1。

样例输入

1
5 5
S-###
-----
##---
E#---
---##

样例输出

9

代码

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> Pair;
int depth[100][100];
int sx, sy, ex, ey;
int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};

int bfs(vector<vector<char>> arr, int n, int m){
	//先把所有节点距离原点的距离初始化为-1,可以作为是否访问过的标记
	memset(depth,-1,sizeof(depth));
	queue<Pair> q;
	q.push(Pair(sx,sy));
	depth[sx][sy] = 0;
	while(!q.empty()){
		Pair temp = q.front();
		q.pop();
		int x = temp.first, y = temp.second;
		//BFS出口,找到终点,结束搜索
		if(x == ex && y == ey)	break;
		for(int i = 0; i < 4; i ++){
			int nx = x + dx[i], ny = y + dy[i];
			//判断能否继续往下走
			if(nx < 0 || ny < 0 || nx >= n || ny >= m || depth[nx][ny] != -1 || arr[nx][ny] == '#')
				continue;
			q.push(Pair(nx,ny));
			depth[nx][ny] = depth[x][y] + 1;
		}
	}
	return depth[ex][ey];
}

int main(){
	int all;	cin >> all;
	while(all--){
		int n,m;	cin >> n >> m;
		vector<vector<char>> arr;
		for(int i = 0; i < n; i ++){
			vector<char> arr1;
			for(int j = 0; j < m; j ++){
				char temp;	cin >> temp;
				arr1.push_back(temp);
			}
			arr.push_back(arr1);
		}
		for(int i = 0; i < n; i ++)
		    for(int j = 0; j < m; j ++){
		        if(arr[i][j] == 'S'){
		            sx = i; sy = j;
		        }
		        else if(arr[i][j] == 'E'){
		            ex = i; ey = j;
		        }
		        continue;
		    }
		        
		cout << bfs(arr,n,m) << endl;
		arr.clear();
	}
	return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页