@guxier
2022-03-24T13:11:58.000000Z
字数 1867
阅读 398
洛谷
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 iii 层楼(1≤i≤N1 \le i \le N1≤i≤N)上有一个数字 KiK_iKi(0≤Ki≤N0 \le K_i \le N0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3,3,1,2,53, 3, 1, 2, 53,3,1,2,5 代表了 KiK_iKi(K1=3K_1=3K1=3,K2=3K_2=3K2=3,……),从 111 楼开始。在 111 楼,按“上”可以到 444 楼,按“下”是不起作用的,因为没有 −2-2−2 楼。那么,从 AAA 楼到 BBB 楼至少要按几次按钮呢?
共二行。
第一行为三个用空格隔开的正整数,表示 。
第二行为 NNN 个用空格隔开的非负整数,表示 。
一行,即最少按键次数,若无法到达,则输出 -1。
5 1 53 3 1 2 5
3
对于 的数据, ,
#include <bits/stdc++.h>#define ios ios::sync_with_stdio(false), cin.tie(0)#define rep(i, a, n) for (int i = a; i <= n; i++)#define per(i, a, n) for (int i = n; i >= a; i--)#define debug(x) cout << #x << ": " << x << endl#define MOD 1000000007#define INF 0x3f3f3f3ftypedef long long LL;using namespace std;const int N = 1e3 + 10;int n , a, b, m[N];bool st[N];int ans = INF;void dfs(int i ,int sum){if(i == b) ans = min(sum, ans);if(sum > ans) return ;st[i] = true;if(i + m[i] <= n && !st[i + m[i]])dfs(i + m[i], sum + 1);if(i - m[i] >= 1 && !st[i - m[i]])dfs(i - m[i] , sum + 1);st[i] = false; //回溯}int main(){cin >> n >> a >> b;rep(i, 1, n)cin >> m[i];st[a] = true;dfs(a, 0);if(ans == INF) cout << -1;else cout << ans;return 0;}
#include <bits/stdc++.h>#define ios ios::sync_with_stdio(false), cin.tie(0)#define rep(i, a, n) for (int i = a; i <= n; i++)#define per(i, a, n) for (int i = n; i >= a; i--)#define debug(x) cout << #x << ": " << x << endl#define MOD 1000000007#define INF 0x3f3f3f3ftypedef long long LL;using namespace std;const int N = 1e3 + 10;int n , a, b, ans = INF , m[N];bool st[N];queue<int> qx , qstep; //qx存储当前楼层 qstep存储按键次数void bfs(){while(!qx.empty()){int x = qx.front();int t = qstep.front();qx.pop(); qstep.pop();if(x == b) ans = min(t, ans);if(x + m[x] <= n && !st[x + m[x]]){qx.push(x + m[x]);qstep.push(t + 1);st[x + m[x]] = true;}if(x - m[x] >= 1 && !st[x - m[x]]){qx.push(x - m[x]);qstep.push(t + 1);st[x - m[x]] = true;}}}int main(){cin >> n >> a >> b;rep(i, 1, n)cin >> m[i];qx.push(a);qstep.push(0);bfs();if(ans == INF) cout << -1;else cout << ans;return 0;}