题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:给出一列楼层,没层楼都有自己的功能,功能的意思是,它能上或者下一定的楼层数,(eg:楼层1 的 功能为 5, 那么它就能向上走五层);第一行给出三个数N,A,B; N为楼层数,A,B为从A层到达B层;第二行给出N楼层的功能,问最少需要按几次电梯的按钮,才能从A到达B
分析:bfs无疑,每一次走到一个楼层,先检查它能到达的楼层有没有被标记过,如果没有,就把能到达的楼层加入队列,并且标记;反之,则不加入队列。这里要注意的是,上或者下两个是并列存在的,所以两个一起加入所列的时候,按钮次数只加1。还有要注意的就是这里如果只用单纯的变量可能会比较复杂,所以利用结构体,把楼层和按钮次数压缩到一个结构体里,所以队列里面的变量为结构体。
ac代码
#include<cstdio>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
const int M = 300;
struct f
{
int n;
int step;
};
int mark[M];
int power[M];
queue<f> q;
int s, e, N;
f x;
int bfs()
{
while(!q.empty())
{
f temp = q.front();
q.pop();
//printf("%d\n", temp.n);
if(temp.n == e)return temp.step;
if(temp.n + power[temp.n] <= N && mark[temp.n + power[temp.n]] != 1)
{
mark[temp.n + power[temp.n]] = 1;
f a;
a.n = temp.n + power[temp.n];
a.step = temp.step + 1;
q.push(a);
}
if(temp.n - power[temp.n] >= 1 && mark[temp.n - power[temp.n]] != 1)
{
mark[temp.n - power[temp.n]] = 1;
f b;
b.n = temp.n - power[temp.n];
b.step = temp.step + 1;
q.push(b);
}
}
return -1;
}
int main()
{
//int N;
while(scanf("%d", &N) && N)
{
scanf("%d %d", &s, &e);
memset(mark, 0, sizeof(mark));
while(!q.empty())q.pop();
for(int i = 1; i <= N; i++)
scanf("%d", &power[i]);
x.n = s;
x.step = 0;
mark[s] = 1;
q.push(x);
printf("%d\n", bfs());
}
return 0;
}