暴搜,dfs。
普及,提高 -。
话说下一次再碰到暴搜就用 bfs 写。
细节 / bug
-
要开 vis 数组——判断走没走过,减少次数;
-
每次回溯的时候清空 vis(两种都可以,见代码);
-
ans 初始值设成
1e7
(反正够大就行了),千万不要设0x7f
,这个小到定义int
就只有 127; -
要在中间判断 cnt(递归传递的变量)是否已经大于等于 ans(还没到达目标状态),是的话,直接返回,减少次数、缩短时间。
注释掉的是一种赋值 vis 的方法,没有注释掉的是另一种方法。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 405;
int n, a, b;
int k[maxn], vis[maxn];
int ans, fla;
int sum;
int read ()
{
int x = 1, s = 0;
char ch = getchar ();
while (ch < '0' or ch > '9'){
if (ch == '-') x = -1;
ch = getchar ();
}
while (ch >= '0' and ch <= '9'){
s = s * 10 + ch - '0';
ch = getchar ();
}
return x * s;
}
void dfs (int s, int t, int cnt)
{
if (s == t)
{
fla = 1;
ans = min (ans, cnt);
return;
}
if (cnt >= ans) return;
int de = k[s];
// vis[s] = 1;
if ((s - de) >= 1 and !vis[s - de])
{
vis[s - de] = 1;
dfs (s - de, t, cnt + 1);
vis[s - de] = 0;
}
if ((s + de) <= n and !vis[s + de])
{
vis[s + de] = 1;
dfs (s + de, t, cnt + 1);
vis[s + de] = 0;
}
// vis[s] = 0;
}
signed main ()
{
ans = 1e7;
n = read (), a = read (), b = read ();
for (int i = 1; i <= n; i++) k[i] = read ();
dfs (a, b, 0);
if (ans == 1e7) printf ("-1\n");
else printf ("%lld\n", ans);
return 0;
}