羅谷 P1135 奇妙なエレベーター - 広蘇

トピックの説明

ふふ、ある日、私はとても奇妙なエレベーターの夢を見ました。エレベーターは建物の各階に停止することができ、i 階 (1≤i≤N) には Ki (0≤Ki ≤N) という番号があります。エレベーターには、開く、閉じる、上がる、下がるの 4 つのボタンしかありません。上下の階数は現在の階数と同じになります。もちろん、要件が満たされていない場合、対応するボタンは無効になります。例: 3、3、1、2、5 は、フロア 1 から始まる Ki (K1 = 3、K2 = 3、…) を表します。1 階で「上」を押して 4 階に移動します。-2 階がないため「下」を押しても機能しません。では、建物 A から建物 B に移動するために必要なボタンを押す最小回数は何回でしょうか?

入力フォーマット

全部で2行あります。

最初の行はスペースで区切られた 3 つの正の整数で、N、A、B (1≤N≤200、1≤A、B≤N) を表します。

2 行目はスペースで区切られた N 個の非負の整数であり、Ki を表します。

出力フォーマット

1行、つまり最小キー押下回数に達しない場合は出力されます -1

入力サンプルと出力サンプル

入力 

5 1 5 
3 3 1 2 5

出力 

3

指示/ヒント

データの 100% の場合、1≤N≤200、1≤A、B≤N、0≤Ki ≤N。

#include<bits/stdc++.h>
using namespace std;
int n,a,b,e[210],vis[210];
int main()
{
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++)
	{
		cin>>e[i];
	}
	queue<int>f;
	queue<int>s;
	f.push(a);
	s.push(0);
	vis[a]=1;
	while(!s.empty())
	{
		if(f.front()==b)
		{
			cout<<s.front()<<endl;
			return 0;
		}
		int t=f.front()+e[f.front()];//上升楼层 
		if(t<=n&&vis[t]==0)
		{
			f.push(t);
			s.push(s.front()+1);
			vis[t]=1;
		}
		t=f.front()-e[f.front()];//下降楼层 
		if(t>=1&&vis[t]==0)
		{
			f.push(t);
			s.push(s.front()+1);
			vis[t]=1;
		}
		f.pop();
		s.pop();
	}
	cout<<-1<<endl;
	return 0;
}

 

おすすめ

転載: blog.csdn.net/m0_73648729/article/details/129368611