番号1078——変なエレベーター

6520 ワード

奇妙なエレベーター——NOI番号1078
質問リンク:NOI OJ 1078
ビルの各階にエレベーターを止めることができます.また、i階(1<=i<=N)にはKi(0<=Ki<=N)という数字があります.エレベーターには4つのボタンしかありません:オン、オフ、オン、ダウン.上下の階数は現在の階の数字に等しいです.もちろん、要求を満たすことができないと、対応するボタンが機能しなくなります.例えば:3 3 3 1 2 5はKi(K 1=3、K 2=3、...)を表し、1階から始まります.1階で「上」を押します4階まで行くことができて、“下”を押すのは役に立たないで、-2階がないためです.では、A階からB階までは少なくとも何回ボタンを押すのでしょうか.
入力:入力ファイルは2行あり、第1行目は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
この問題は直接1つの検索アルゴリズムで、最大再帰深さを設定して、完成します!
コード:
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int N, A, B,*K;
void search(int curr, int step) {
	if (curr == B) {//  
		cout << step;
		exit(0);
	}
	if (step >= 500) {//       500
		cout << -1;
		exit(0);
	}
	if (curr + K[curr] <= B) {
		search(curr + K[curr], step + 1);
	}
	if (curr - K[curr] >= 1) {
		search(curr - K[curr], step + 1);
	}
}
int main()
{
	cin >> N >> A >> B;
	K = new int[N];
	for (int i = 1; i <= N; i++)cin >> K[i];
	search(A, 0);
}