输入样例:
5 1 5
3 3 1 2 5
输出样例:
3
AC代码(bfs):
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;//当前层数,步数
int n,a,b;
int k[205];
int vis[205];
int flag=1;
void bfs()//找最优用 bfs 比较好
{
queue<P> q;
q.push(P(a,0));
while(!q.empty())
{
P t=q.front();
q.pop();
int floor=t.first,cnt=t.second;
if(floor==b)
{
cout<<cnt<<endl;
flag=0;
return ;
}
vis[floor]=1;
int up=floor+k[floor],down=floor-k[floor];
if(up<=n&&!vis[up]) //能向上走且没走过
q.push(P(up,cnt+1));
if(down>=1&&!vis[down]) //能向下走且没走过
q.push(P(down,cnt+1));
}
return ;
}
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>k[i];//第 i 层楼能上下的层数
bfs();
if(flag)
cout<<-1<<endl;
return 0;
}
AC代码2(dfs):
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,a,b;
int k[205];
int vis[205];
int ans=inf;
void dfs(int floor,int cnt)
{
if(cnt>ans)//剪枝
return ;
if(floor==b)
{
ans=min(ans,cnt);
return ;
}
vis[floor]=1;
int up=floor+k[floor],down=floor-k[floor];
if(up<=n&&!vis[up])
dfs(up,cnt+1);
if(down>=1&&!vis[down])
dfs(down,cnt+1);
vis[floor]=0;
return ;
}
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>k[i];
dfs(a,0);//从a楼开始走
if(ans==inf)
cout<<-1<<endl;
else
cout<<ans<<endl;
return 0;
}