洛谷P1135 奇怪的电梯【bfs】

题目https://www.luogu.org/problemnew/show/P1135

题意:

一共有n层楼,在第i层可以往上或往下$k_i$层。

问从$a$层到$b$层至少需要多少乘多少次电梯。

思路:

bfs

用vis标记当前层是否已访问过,如果是就不再重新入队因为肯定会循环。

要注意判断一下加或减层数时会不会越界。

 #include<stdio.h>
#include<stdlib.h>
#include<map>
#include<set>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<int, int> pr; const int maxn = ;
int n, a, b;
int go[maxn];
int vis[maxn]; int main()
{
scanf("%d%d%d", &n, &a, &b);
for(int i = ; i <= n; i++){
scanf("%d", &go[i]);
} queue<pr>que;
que.push(make_pair(a, ));
int ans = -;
while(!que.empty()){
pr now = que.front();que.pop();
if(now.first == b){
ans = now.second;
break;
}
if(now.first - go[now.first] > && !vis[now.first - go[now.first]]){
que.push(make_pair(now.first - go[now.first], now.second + ));
vis[now.first - go[now.first]] = true;
}
if(now.first + go[now.first] <= n && !vis[now.first + go[now.first]]){
que.push(make_pair(now.first + go[now.first], now.second + ));
vis[now.first + go[now.first]] = true;
}
}
printf("%d\n", ans); return ;
}
上一篇:U3D框架—单例框架


下一篇:mysql 5.6.20 数据库中文乱码解决方法