【DFS】奇怪的电梯(C++)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/liuzich/article/details/101921035

【题目描述】

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

【输入】

共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

【输出】

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

【输入样例】

5 1 5
3 3 1 2 5

【输出样例】

3







这题看起来比普通的DFS要难一些其实也差不多,你看哈:

5
2
1
3
3

我不论在哪一楼,都只有两种走法,一种是上升,一种是向下降,和其他的DFS是一样的,例如样例,我在1楼,要去5楼,就只能向上走,到达4楼,因为没有-2楼,所以不可向下走,在4楼,又只能向下走,就到了2楼,因为没有6楼,在2楼,又只能向上走,到达5楼,因为没有-1楼,于是样例就是这样。
写得累死我了
说了这么多应该明白了,下面看代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[208],q,z,ans=INT_MAX;
bool ok[208];
void dfs(int x,int dep)
{
	int tx=x+a[x],ty=x-a[x];
	if(x==z)
	{
		ans=min(ans,dep);
		return ;
	}
	if(tx>0&&tx<=n&&!ok[tx])
	{
		ok[tx]=true;
		dfs(tx,dep+1);
	}
	if(ty>0&&ty<=n&&!ok[ty])
	{
		ok[ty]=true;
		dfs(ty,dep+1);
	}
}
int main() {
	memset(ok,false,sizeof(ok));
	cin>>n>>q>>z;
	ok[q]=true;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	dfs(q,0);
	if(ans==INT_MAX)
	{
		cout<<-1<<endl;
		return 0;
	}
	cout<<ans<<endl;

	return 0;
}

就到这了

猜你喜欢

转载自blog.csdn.net/liuzich/article/details/101921035