题意:有个电梯在每一层只有固定的往上的楼数和往下的楼数,求起点到终点的电梯最少移动的步数
思路:广度搜索按层搜索即可,每次记录步数,一到终点就退出循环。用C++的STL队列要方便些。
代码:
#include <iostream>
using namespace std;
#include <queue>
#include <stdio.h>
#include <string.h>
int N, A, B;
int floor1[256], flag[256];
void bfs(int s, int e)
{
queue<int>q;
q.push(s); //入队
flag[s] = 1;
int t, next;
while(!q.empty())
{
t = q.front(); //得到队首的结点
q.pop(); //出队
if(t == e) //到达终点就退出
{
break;
}
next = t + floor1[t] ;//向上
if(next <= B && flag[next]==0)
{
q.push(next);
flag[next] = flag[t]+1; //记录步数
}
next = t - floor1[t]; //向下
if(next >= 1 && flag[next]==0)
{
q.push(next);
flag[next] = flag[t]+1;
}
}
if(t!=e)
{
flag[B] = 0;
}
}
int main()
{
while(scanf("%d", &N) && N!=0)
{
scanf("%d %d", &A, &B);
for(int i = 1; i <= N; i++)
{
scanf("%d", &floor1[i]);
}
memset(flag, 0, sizeof(flag));
bfs(A, B);
printf("%d\n", flag[B]-1);
}
return 0;
}