Luo Gu P1135 strange elevator BFS & DFS

Topic links:
https://www.luogu.org/problem/P1135

Reference Code:

DFS:

#include<bits/stdc++.h>
using namespace std;
int n,a,b,arr[201],ans=100000;
bool cf[201];
void dfs(int now,int sum)//now现在的楼层,sum按按钮的次数
{
	if(now==b)
		ans=min(ans,sum);
	else if(sum<=ans)
	{
		cf[now]=true;
		if(now+arr[now]<n&&!cf[now+arr[now]])//未越界并且没有去过下一个楼层
			dfs(now+arr[now],sum+1);//向上走
		if(now-arr[now]>=1&&!cf[now-arr[now]])
			dfs(now-arr[now],sum+1);//向下走
		arr[now]=false;
	}
}
int main() 
{
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++)
		cin>>arr[i];
	cf[a]=true;
	dfs(a,0);
	if(ans!=100000)
		cout<<ans;
	else
		cout<<-1;
	return 0;
}

BFS:

#include<queue>
#include<bits/stdc++.h>
using namespace std;
struct QElement
{
	int floor;//当前楼层编号
	int pushcount;//计数
};
queue<QElement> q;//定义元素为qelement的队列q
int n,a,b;
int s[1000];//数组s记录每个楼层按按钮后能上下的楼层数
int t[1000]={0};//记录是否访问过,重复
int main() 
{
	QElement e1,e2;
	int i;
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++)
		cin>>s[i];
	e1.floor=a;
	e1.pushcount=0;
	q.push(e1);//初始状态人队
	t[a]=1;
	while(!q.empty())//队列不是空,继续宽度优先搜索
	{
		e2=q.front();//获取队首元素
		q.pop();//队头元素出队(注意:c++的队列模板类中,获取队头元素并不会将该元素从队列中删除,需要使用pop函数删除该元素)
		if(e2.floor==b)
			break;
		i=e2.floor+s[e2.floor];//按向上按钮后能够到达的楼层
		if(i<=n&&t[i]==0)
		{
			e1.floor=i;
			e1.pushcount=e2.pushcount+1;
			q.push(e1);
			t[i]=1;//标记
		}
		i=e2.floor-s[e2.floor];
		if(i>=1&&t[i]==0)
		{
			e1.floor=i;
			e1.pushcount=e2.pushcount+1;
			q.push(e1);
			t[i]=1;
		}

	}
	if(e2.floor==b)
		cout<<e2.pushcount;
	else 
		cout<<-1;
	return 0;
}

Published 77 original articles · won praise 19 · views 10000 +

Guess you like

Origin blog.csdn.net/qq_43488547/article/details/100060467