题目链接:
https://www.luogu.org/problem/P1135
参考代码:
DFS:
#include<bits/stdc++.h>
using namespace std;
int n,a,b,arr[201],ans=100000;
bool cf[201];
void dfs(int now,int sum)//now现在的楼层,sum按按钮的次数
{
if(now==b)
ans=min(ans,sum);
else if(sum<=ans)
{
cf[now]=true;
if(now+arr[now]<n&&!cf[now+arr[now]])//未越界并且没有去过下一个楼层
dfs(now+arr[now],sum+1);//向上走
if(now-arr[now]>=1&&!cf[now-arr[now]])
dfs(now-arr[now],sum+1);//向下走
arr[now]=false;
}
}
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>arr[i];
cf[a]=true;
dfs(a,0);
if(ans!=100000)
cout<<ans;
else
cout<<-1;
return 0;
}
BFS:
#include<queue>
#include<bits/stdc++.h>
using namespace std;
struct QElement
{
int floor;//当前楼层编号
int pushcount;//计数
};
queue<QElement> q;//定义元素为qelement的队列q
int n,a,b;
int s[1000];//数组s记录每个楼层按按钮后能上下的楼层数
int t[1000]={0};//记录是否访问过,重复
int main()
{
QElement e1,e2;
int i;
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>s[i];
e1.floor=a;
e1.pushcount=0;
q.push(e1);//初始状态人队
t[a]=1;
while(!q.empty())//队列不是空,继续宽度优先搜索
{
e2=q.front();//获取队首元素
q.pop();//队头元素出队(注意:c++的队列模板类中,获取队头元素并不会将该元素从队列中删除,需要使用pop函数删除该元素)
if(e2.floor==b)
break;
i=e2.floor+s[e2.floor];//按向上按钮后能够到达的楼层
if(i<=n&&t[i]==0)
{
e1.floor=i;
e1.pushcount=e2.pushcount+1;
q.push(e1);
t[i]=1;//标记
}
i=e2.floor-s[e2.floor];
if(i>=1&&t[i]==0)
{
e1.floor=i;
e1.pushcount=e2.pushcount+1;
q.push(e1);
t[i]=1;
}
}
if(e2.floor==b)
cout<<e2.pushcount;
else
cout<<-1;
return 0;
}