P1135 奇怪的电梯 dfs + 剪枝
作者:
多米尼克領主的致意
,
2024-05-14 11:40:48
,
所有人可见
,
阅读 5
直接爆搜:18分
记忆化:40分
dfs + 剪枝
1.可行性 2.最优 3.上下层可以是0 4.最关键的是记录到这层最小的次数 记忆化的一种
但是是记录之前的步数 而记忆化是记忆这之后的最短路径 此题用第一种更合理
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 420;
int arr[N];
int n, a, b;
int mx = 0x3f3f3f3f;
int vis[N];
void dfs(int u, int cnt){
if(u < 1 || u > n)return;
if(cnt >= mx)return;
if(u == b){
mx = cnt;
return;
}
if(cnt >= vis[u])return;
if(arr[u] == 0)return;
vis[u] = cnt;
dfs(u + arr[u], cnt + 1);
dfs(u - arr[u], cnt + 1);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >>n >> a >> b;
for(int i = 1;i <= n;i++)cin >> arr[i];
memset(vis, 0x3f3f3f3f, sizeof vis);
dfs(a, 0);
// for(int i = 1;i <= n;i++)cout << vis[i] << " ";
cout << endl;
if(mx == 0x3f3f3f3f)cout << -1;
else cout << mx;
return 0;
}