接下来给出n个数,代表第i层能向上或向下走j层
比如题目给的例子
电梯有5层,你在第一层,想到第五层
第一层为3,即可向上或向下走3层,中间不能停,而且层数不能低于1或高于5,
要求出从1到5最小次数
题目为1向上走3,到了第4层,向下走2,到了第2层,再向上走3,到终点,共3步
注意a==b,结果为0
代码:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<queue>
#include<math.h>
using namespace std;
int flo[250];
bool flag[250];
int n, a, b;
struct F
{
int i;
int c;
}f;
queue<F> fs;
int dis[2] = { -1, 1 };
void bfs()
{
while (!fs.empty())
{
F f1 = fs.front();
fs.pop();
for (int i = 0; i < 2; ++i)
{
int x = f1.i + flo[f1.i] * dis[i];
if (x == b)
{
cout << f1.c + 1 << endl;
while (!fs.empty())
{
fs.pop();
}
return;
}
if (x <= n && x >= 1 && !flag[x])
{
f.i = x;
flag[x] = true;
f.c = f1.c + 1;
fs.push(f);
}
}
}
cout << -1 << endl;
}
int main()
{
while (cin >> n && n)
{
memset(flo, 0, sizeof(flo));
memset(flag, 0, sizeof(flag));
cin >> a >> b;
for (int i = 1; i <= n; ++i)
{
cin >> flo[i];
}
if (a == b)
{
cout << 0 << endl;
}
else
{
f.i = a;
f.c = 0;
flag[a] = true;
fs.push(f);
bfs();
}
}
return 0;
}