问题 N: A strange lift(BFS)

伪代码:

function bfs(fir, end, num, arr):
    初始化队列并加入起始楼层fir
    标记起始楼层为已访问

    while 队列不为空:
        for 队列中每个元素的数量:
            取出并移除队列首元素为current

            if current == end:
                输出当前深度并返回

            计算并尝试访问current的上下楼层
                if 新楼层有效且未访问:
                    标记为已访问
                    加入队列

        深度加一

    输出-1  # 如果无法到达目标楼层

代码如下: 

#include<queue>
#include<iostream>
using namespace std;
int main()
{
	int num=1;
	while (scanf("%d", &num) && num)
	{
		queue<int> disp;
		int fir = 0, end = 0;
		int arr[209] = { 0 };
		int visit[209] = { 0 };
		int floor[209] = { 0 };
		
		// 初始化队列
		while (!disp.empty()) disp.pop();
		
		// 起终点
		scanf("%d%d", &fir,& end);

		// 输入num个系数
		for (int i = 1; i <= num; i++)
			scanf("%d", &arr[i]);

		// 初始化标记数组
		for (int i = 0; i <= num; i++)
			visit[i] = 1;

		disp.push(fir);

		int k = 0, node = 0,node1=1;
		while (!disp.empty())
		{
			// 初始化接下来该层有效结点
			node = 0;

			// 上层对应有多少个子点(作为该层的夫点),就遍历多少个点
			// 对每个结点做判断 并 加入左右子点的操作
			for (int i = 0; i < node1; i++)
			{
				int temp = disp.front();

				// 如果和目标值一致输出
				if (temp == end) { 
				cout << k << endl;
				while (!disp.empty()) disp.pop();
				break;}

				// 做标记
				visit[temp] = 0;

				// 弹出结点
				disp.pop();

				// 计算上下楼层
				int up = temp + arr[temp];
				int down = temp - arr[temp];

				// 上层楼层<=num,且如果上层楼层未标记,加入队列,有效点数加一
				if (up <= num && visit[up])
				{
					disp.push(up); node++;
				}

				// 下层楼层>=1,且如果下层楼层未标记,加入队列,有效点数加一
				if (down >= 1 && visit[down])
				{
					disp.push(down); node++;
				}

				// 如果队列为空退出
				if (disp.empty()) { 
				cout << -1 << endl; 
				while (!disp.empty()) disp.pop();
				break;
				}
			}node1 = node;// 该层结点数作为下层的父点
			k++;          // 计算按钮次数
		}
	}
	return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值