bfs: kotori和迷宫

题目链接:kotori和迷宫

迷宫就是一层一层往外走的,所以很符合bfs的特征。

设置两个数组,一个用于题目输入,一个用于记录行走距离(距离一定是最短,bfs特征)。他们分别为数组a(char类型),数组dist。

输入迷宫地图,为数组a,找到起点'k',坐标为beginx, beginy。

bfs()。将数组dist全部初始化成-1,表示数组内的坐标都没有走过。

dist 起点 beginx, beginy 的距离设置为0,从这个点开始走。创建队列,把这个起点推入队列。

队列里都是没有走过的元素。当队列里没有元素时while(q.size()),循环就结束了

位移方案有4种,上下左右,设置数组dx 和 dy,坐标从0到3控制方向。

取队列中元素 ,化为坐标**,加上 dx\[\] 和 dy\[\]** ,得出行走一步后的坐标。如果这个坐标++满足要求(在数组中),并且这一步不是墙 并且这一步dist 是-1(没有走过). 位移距离+1++.

if内,这个点要么是路,要么是终点。dist都是离k的距离。

++再判断这个点是不是终点,如果走到终点就没必要走了,continue掉,否则就push进队列中。++

cpp 复制代码
#include <iostream>
#include <cstring>
#include <queue> 

using namespace std;

const int N = 31;

char a[N][N];
int dist[N][N];

int n, m;
int beginx, beginy; 

int dx[] = {0, 1, 0, -1};
int dy[] = {-1, 0, 1, 0};

typedef pair<int, int> PII;

queue<PII> q;

void bfs()
{
	memset(dist, -1, sizeof(dist));
	q.push({beginx, beginy});
	
	dist[beginx][beginy] = 0;
	
	while(q.size())
	{
		auto t = q.front(); q.pop();
			
		int x1 = t.first, y1 = t.second;
		
		for (int i = 0; i < 4; i++)
		{
			int x2 = x1 + dx[i], y2 = y1 + dy[i];
			
			if (x2 >= 1 && x2 <= n && y2 >= 1 && y2 <= m && a[x2][y2] != '*' && dist[x2][y2] == -1)
			{
				dist[x2][y2] = dist[x1][y1] + 1;
				
				if (a[x2][y2] == 'e') continue;
				
				q.push({x2, y2});
			}
		}
	}
}

int main()
{
	cin >> n >> m;
	
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			
			if (a[i][j] == 'k') beginx = i, beginy = j;
		}
	}
	
	bfs();
	
	int ret = 1e6 + 10, cnt = 0;
	
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (a[i][j] == 'e' && dist[i][j] != -1) 
			{
				cnt++;
				ret = min(ret, dist[i][j]);
			}
		}
	}
	
    if (cnt == 0) cout << -1 << endl;
	else cout << cnt << " " << ret << endl;	
	
	return 0;
}

题目求 能到达的出口数量 和 最近距离出口,那么,只要统计e这个位置,dist中这个坐标数值 是不是-1,如果是-1,说明这个出口没走过,没到达这个出口;不是-1,说明这个位置走过,到达了出口。到达出口,就cnt++,并且更新最小距离。

相关推荐
旖旎夜光6 分钟前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
一条大祥脚13 分钟前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
奈斯先生Vector16 分钟前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
2601_9561219728 分钟前
Bellman-ford算法
算法
叠层归一研究院34 分钟前
基于区分本源的此刻存在唯一性本体论推演
人工智能·算法
luj_176835 分钟前
尾椎藏今生记忆?骨盆对应不确定性
开发语言·网络·c++·经验分享·算法
深圳多奥智能一卡(码、脸)通系统37 分钟前
智能梯控SDK可直接用于第三方开发对接的接口文档说明书
服务器·前端·算法
裕晟资质规划10 小时前
武器装备科研生产单位保密资质申请方法论:条件模型与流程拆解
人工智能·算法
en.en..11 小时前
C语言 标准输入 / 输出缓冲区
算法