PTA第5周——4 奇怪的电梯

题目:

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

输入格式:

第一行包含3个用空格隔开的正整数,分别表示N,A,B (1≤N≤200,1≤A,B≤N) 。
第二行包含N 个用空格隔开的非负整数,表示Ki 。

输出格式:

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

输入样例:

5 1 5
3 3 1 2 5

输出样例:

3

题意分析:

找出到达目标楼层的最少次数。

解题思路:

使用深搜的方法进行遍历查找。

具体算法流程:

使用深搜思想,从起点a开始查找并记录次数。当到达目标楼层时,与ans比较大小,将小的存入ans中;否则从上下两个方向继续往下查找,进行深搜。

实现细节(代码):

#include<bits/stdc++.h>
using namespace std;
int n,a,b;
int x[205];
int mapp[205];
long long ans=-1;
int dfs(int y,int z,long long t)
{
	if(y==z)
	{
		if(ans==-1) ans=t;
		else if(t<ans) ans=t;
	}
	else
	{
		int y1=y+x[y];
		int y2=y-x[y];
		long long tt=t+1;
		mapp[y]=1;
		if(y1>=1&&y1<=n&&mapp[y1]==0) dfs(y1,z,tt);
		if(y2>=1&&y2<=n&&mapp[y1]==0) dfs(y2,z,tt);
		mapp[y]=0;
	}
}
int main()
{
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++) cin>>x[i];
	mapp[a]=1;
	dfs(a,b,0);
	cout<<ans;
	return 0;
}

总结:

注意mapp的标记以及回溯时取消标记,避免重复查找空间溢出引发段错误,在下一次搜索前要验证是否在题目的限定范围内,避免超出空间。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇