题目:https://www.luogu.com.cn/problem/P1135
solve1:dfs
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 210;
int N, A, B;
int k[MAXN];
int ans = INF;
int book[MAXN];
void dfs(int now, int cnt)
{
if(now == B)
{
ans = min(ans, cnt);
return ;
}
if(cnt <= ans)//剪枝,如果当前次数cnt大于ans,那么这个cnt一定不是答案
{
book[now] = 1;
if(now + k[now] <= N && !book[now + k[now]]) dfs(now + k[now], cnt + 1);
if(now - k[now] > 0 && !book[now - k[now]]) dfs(now - k[now], cnt + 1);
book[now] = 0;
}
}
int main()
{
scanf("%d %d %d", &N, &A, &B);
for(int i = 1; i <= N; i++)
scanf("%d", &k[i]);
memset(book, 0, sizeof(book));
dfs(A, 0);
if(ans != INF)
printf("%d\n", ans);
else
printf("-1\n");
return 0;
}
solve2:bfs
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 210;
int N, A, B;
int k[MAXN];
int ans = INF;
int book[MAXN];
struct node
{
int nod, cnt;
};
queue<node> q;
int num[MAXN];//一个点经过了几次
void bfs()
{
while(!q.empty())
{
node now = q.front(); q.pop();
book[now.nod] = 0 ;
if(now.nod == B)
{
ans = min(ans, now.cnt);
}
num[now.nod]++;
if(num[now.nod] >= N) return ;//如果当前的点经过了N次,说明进入了一个循环
if(now.nod + k[now.nod] <= N && !book[now.nod + k[now.nod]])
{
q.push({now.nod + k[now.nod], now.cnt + 1});
book[now.nod + k[now.nod]] = 1;
}
if(now.nod - k[now.nod] > 0 && ! book[now.nod - k[now.nod]])
{
q.push({now.nod - k[now.nod], now.cnt + 1});
book[now.nod - k[now.nod]] = 1;
}
}
}
int main()
{
scanf("%d %d %d", &N, &A, &B);
for(int i = 1; i <= N; i++)
scanf("%d", &k[i]);
memset(book, 0, sizeof(book));
memset(num, 0, sizeof(num));
q.push({A, 0});
book[A] = 1; num[A] ++;
bfs();
if(ans != INF)
printf("%d\n", ans);
else
printf("-1\n");
return 0;
}