洛谷P1135 奇怪的电梯(BFS广度优先搜索基础题)

感谢B站喵の编程小课堂5:图论 深搜与宽搜_哔哩哔哩_bilibili

广度优先搜索算法的基本思想:

1、对于初始状态入队,设置初始状态为已访问。

2、如果队列不为空时,出队队头元素,否则跳到第五步。

3、检查出队的元素,检查所有相邻状态,如果有效且未访问,则将所有有效的相邻状态进行入队,并且设置这些状态为已访问,然后跳到第二部重复执行。

4、对于所有出队的元素,检查所有相邻状态,如果有效且未访问,则所有有效的相邻元素进行入队,并且设置这些状态为已访问,然后跳到第二步重复执行。

5、检查最后出队的元素是否为最终解,如果是输出结果,否则说明无解。

题目链接:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

无权有向图

按样例解析:

第一层能去第四层,第二层能去第五层,第三层能去二、三层,第四层能去第二层,第五层没有能去的楼层。

则红线为最短路径,共三步

image

代码:

#include <iostream>
#include <queue>
#include <string>
using namespace std;
bool visited[205];//记录数组
int k[205];
struct node
{
	int id, step;
	node(int id_, int step_) { //struct的构造函数
		id = id_;
		step = step_;
	}
	node() { //重载构造函数
		id = step = -1;
	}
};
int main()
{
	int n, a, b;// n是总数,a是初始楼层,b是要去的楼层
	queue<node>q;
	node x;
	cin >> n >> a >> b;
	for (int i = 1; i <= n; i++)
	{
		cin >> k[i];
	}
	node root(a, 0);//从a层开始搜索
	q.push(root);
	while (!q.empty())
	{
		x = q.front();
		q.pop();
		if(x.id==b) //找到了就退出
			break;
		if(x.id+k[x.id]<=n&&!visited[x.id+k[x.id]]) //如果楼层可以去且未去过则入队
		{
			node temp(x.id + k[x.id], x.step + 1);
			q.push(temp);
			visited[x.id + k[x.id]] = true;
		}
		if(x.id-k[x.id]>=1&&!visited[x.id-k[x.id]])//如果楼层可以去且未去过则入队
		{
			node temp(x.id - k[x.id], x.step + 1);
			q.push(temp);
			visited[x.id - k[x.id]] = true;
		}
	}
	if (x.id == b)
		cout << x.step;
	else
		cout << -1;
	return 0;
}

心得:感谢B站评论区把up的Pascal代码转成C++,VS2022代码提示还是没有Resharp C++好用

posted @ 2022-01-10 23:06  张牧歌  阅读(142)  评论(0编辑  收藏  举报