hdu 1548

题目链接: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值