P1135 奇怪的电梯 题解
wwwidk1234 · · 题解
洛谷题目传送门!
我的个人博客!
前言
本题是一道经典搜索练习题。
前置知识:
- BFS 广度优先搜索算法。
- 队列。
解题步骤
首先看数据范围
这里用 p++,如果要出队则 q++。
完整代码
//bfs广搜
#include<bits/stdc++.h>
using namespace std;
int a,b,x[500]/*电梯上的数字*/;
bool vis[500];
int q,p; //头、尾指针
int N;
struct node
{
int floor,dep;
}Q[1000];
int bfs() //广搜
{
if(a==b) return 0; //如果开始层等于结束层,直接返回0步
int ans,top,k;
Q[1]={a,0};
q=1;p=2;
while(q<p)
{
top=Q[q].floor;ans=Q[q].dep;
for(int i=-1;i<=1;i+=2)
{
k=top+x[top]*i;
if (k>=1&&k<=N&&!vis[k])
{
vis[k]=true;
if(k==b) return ans+1; //到达终点,返回答案
Q[p]={k,ans+1}; //入队列
p++;
}
}
q++;
}
return -1;
}
int main()
{
cin>>N>>a>>b;
for(int i=1;i<=N;i++) cin>>x[i];
cout<<bfs();
return 0;
}