Problem : 1548 ( A strange lift ) Judge Status : Accepted
RunId : 4346236 Language : G++ Author : nasta
题意:
一个特别的电梯,按up可升上k[i]层,到大i+k[i]层,down则到达i-k[i]层,最高不能超过n,最低不能小于1,给你一个起点和终点,问最少可以按几次到达目的地。
思路:
BFS。自己居然因为输入问题以及数组大小问题WA了多次。。。
#include <iostream>
#include <queue>
//#include <fstream>
#define N 210
using namespace std;
int k[N];
int hash[N];
int step[N];
int bfs(int a, int b, int n, int *k)
{
queue<int> q;
for(int i=0; i < N; ++i)
{
hash[i] = 0;
step[i] = -1;
}
q.push(a);
hash[a]=1;
step[a]=0;
while(!q.empty())
{
int u = q.front();q.pop();
int d[2] = {u-k[u-1], u+k[u-1]};
//printf("u: %d\tk: %d\td: %d\tu: %d\n", u, k[u], d[0], d[1]);
if(u == b)
return step[u];
for(int i=0; i < 2; ++i)
if(d[i]>0 && d[i]<= n && hash[d[i]] == 0)
{
hash[d[i]]=1;
step[d[i]] = step[u]+1;
q.push(d[i]);
}
}
return -1;
}
int main()
{
//freopen("in.txt", "rb", stdin);
int n, a, b;
for(;;)
{
cin >> n;
if(n == 0)
break;
cin >> a >> b;
for(int i=0; i < n; ++i)
cin >> k[i];
cout << bfs(a, b, n, k) << endl;
}
//fclose(stdin);
return 0;
}