#C08L10P02. C08.L10.宽度优先搜索BFS.程序填空.奇怪的电梯

C08.L10.宽度优先搜索BFS.程序填空.奇怪的电梯

题目描述

有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 i 层楼(1 ≤ i ≤ N)上有一个数字 KiK_i;(0 ≤ KiK_i ≤ N)。

电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5 代表了 KiK_iK1K_1 = 3,K2K_2 = 3,...),从一楼开始。在一楼,按“上”可以到 4 楼,按“下”是不起作用的,因为没有 -2 楼。那么,从 A 楼到 B 楼至少要按几次按钮呢?

输入格式

第 1 行为三个正整数,表示 N,A,B(1 ≤ N ≤ 200,1 ≤ A,B ≤ N);

第 2 行为 N 个正整数,表示 KiK_i

输出格式

1 个整数,即最少按键次数,若无法到达,则输出 -1。

样例

5 1 5
3 3 1 2 5
3

程序填空

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int floor,ans;
};
queue <node> q;
int k[201],n,a,b;
bool flag[201],Found;
void bfs()
{
	node t,NEW;
	while(!q.empty())
	{
		t = 填空(1) ;
		填空(2) ;
		if(t.floor+k[t.floor]<=n&&!flag[t.floor+k[t.floor]])
		{
			NEW.floor = t.floor+k[t.floor];
			NEW.ans = t.ans + 1;
			if(NEW.floor==b)
			{
				cout<<NEW.ans;
				Found = true;
				return;
			}
			q.push(NEW);
			flag[t.floor+k[t.floor]] = true;
		}
		
		if(填空(3)>=1&&!填空(4))
		{
			NEW.floor = 填空(5);
			NEW.ans = 填空(6);
			if(NEW.floor==b)
			{
				cout<<NEW.ans;
				填空(7);
				return;
			}
			填空(8);
			flag[ 填空(9) ] = true;
		}
	}
}
int main()
{

	cin>>n>>a>>b;
	if(a==b)
	{
		cout<<0;
		return 0;
	}
	
	for(int i=1;i<=n;i++)
		cin>>k[i];

	node t;
	t.floor=a;
	t.ans=0;
	flag[a] = true;
	q.push(t);
	bfs();
	if(填空(10))
		cout<<"-1";
	
	return 0;
}

填空(1):{{ input(1) }}

填空(2):{{ input(2) }}

填空(3):{{ input(3) }}

填空(4):{{ input(4) }}

填空(5):{{ input(5) }}

填空(6):{{ input(6) }}

填空(7):{{ input(7) }}

填空(8):{{ input(8) }}

填空(9):{{ input(9) }}

填空(10):{{ input(10) }}