dfs
这道题一种做法是dfs,如果dfs超时的话,那就要使劲想办法剪枝,还有回溯一定要搞清楚。两篇回溯参考自己抽空精读一下.
回溯的原因是我们要找到所有情况的最优解,而不是只找到一种情况。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e2+10;
const int maxn1=0x3f3f3f3f;
int n,a,b,cnt=maxn1;
int s[maxn];
bool ok[maxn];
void dfs(int k,int x){
if(x<1||x>n||ok[x]||k>cnt)return;
if(x==b){
cnt=min(cnt,k);
return;
}
ok[x]=true;
dfs(k+1,x+s[x]);
dfs(k+1,x-s[x]);
ok[x]=false;//回溯
}
int main(){
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++){
scanf("%d",&s[i]);
}
dfs(0,a);
if(cnt==maxn1)
printf("-1\n");
else
printf("%d\n",cnt);
}
bfs
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e2+10;
const int maxn1=0x3f3f3f3f;
int n,a,b,k[maxn],num=maxn1;
bool ok[maxn];
struct node{
int x,step;
};
queue<node> q;
void bfs(int now,int x){
node p;
p.step=now;p.x=x;
q.push(p);
ok[x]=true;
while(!q.empty()){
node Top=q.front();q.pop();
if(Top.x==b){
num=Top.step;
break;
}
if(Top.x+k[Top.x]<=n&&!ok[Top.x+k[Top.x]]){
ok[Top.x+k[Top.x]]=true;
node sum;
sum.step=Top.step+1;sum.x=Top.x+k[Top.x];
q.push(sum);
}
if(Top.x-k[Top.x]>=1&&!ok[Top.x-k[Top.x]]){
ok[Top.x-k[Top.x]]=true;
node sum;
sum.step=Top.step+1;sum.x=Top.x-k[Top.x];
q.push(sum);
}
}
}
int main(){
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++)
scanf("%d",&k[i]);
bfs(0,a);
if(num!=maxn1)
printf("%d\n",num);
else printf("-1\n");
}