1.题目编号:1013和1014
2.简单题意:有一个奇怪的电梯,电梯可以停在你想停的任意一层,每一层都有一个数k[i],并且每一层只有向上和向下两个按钮,当你在i层时你按向上的按钮它会向上送你k[i]层,你将会到达第i+k[i]层,如果你按向下则会向下k[i]层,你将会到达第i-k[i]层,当然了,电梯不会上升到比n层还高也不会低于第1层。给你三个数N,A,B,然后是N个k[i],N为建筑物的高度,A为你开始在的层数,B为你最后要到达的层数,要求求出最少需要按几次。
3.解题思路形成过程:首先看到这个题就想到广度搜索,首先得定义一个数据类型,存放到几层之后走了几步,还要标记已经走过的层,在广度搜索中当队列非空时先搜向下的,然后向上的,若空了还没有到达要到的层就返回-1
4.感悟:感觉好像做过这个题,但好像貌似不是用这种方法做的……忘记了
5.AC的代码:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int k[201],mark[201];
int A,B,N;
struct Record
{
int lift,step;
};
int bfs()
{
Record a,b;
queue <Record> q;
memset(mark,0,sizeof(mark));//没走过的层都为0
a.lift=A;
a.step=0;
mark[a.lift]=1;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.lift==B)
return a.step;// 到达终点 直接返回步数
b.lift=a.lift-k[a.lift];
if(b.lift>0 && b.lift<=N && !mark[b.lift])
{
b.step=a.step+1;
mark[a.lift]=1;
q.push(b);
}
b.lift=a.lift+k[a.lift];
if(b.lift>0 && b.lift<=N && !mark[b.lift])
{
mark[a.lift]=1;
b.step=a.step+1;
q.push(b);
}
}
return -1;
}
int main()
{
int i;
while(cin>>N&&N)
{
cin>>A>>B;
for(i=1;i<=N;++i)
cin>>k[i];
cout<<bfs()<<endl;
}
return 0;
}
原题:
5 1 5<br>3 3 1 2 5<br>0
3