NKOJP1144 ----电梯

该博客讨论了一个关于 NK 中学科学馆大楼电梯的奇怪规则。从 A 楼到 B 楼的最少按键次数可通过深度优先搜索(DFS)算法解决。博主建议在不越界的情况下向上或向下搜索,并强调在实现 DFS 时要避免重复判定,初始化答案为最大值,并在找不到路径时返回 -1。
C电梯
时间限制 : 10000 MS   空间限制 : 65536 KB

问题描述

NK中学科学馆大楼装上了一种奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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≤2000, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

输出格式

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

样例输入

5 1 5
3 3 1 2 5

样例输出

3

提示

1→4→2→5


一道 搜索 

至于你想用dfs还是bfs都无所谓

那么我就讲讲dfs的解法

思路很简单:只要每越界,就朝上和朝下搜,搜到终点就return;

(注意,深搜有多个答案,return时记得去min)


ans = min(ans, sum);

那,深搜分支该怎么写呢?

if 现在的位子 + 移动的楼数 <= 大楼最高层:dfs(下一步,次数加)//判断语句检查是否越界、

//同样,往下走就判断下面是否越界,然后继续dfs

⚠️注意!!:一定要记得申明一个访问数组,以免重复判定!!⚠️

一定要记得申明一个访问数组,以免重复判定

一定要记得申明一个访问数组,以免重复判定

重要的事情说三遍~

void dfs(int s, int sum) {
	if (s == b) { // 是否已找到答案
		ans = min(ans, sum);
		return;
	} else if (sum <= ans) {
		v[s] = 1;//访问数组去重
		if (s + c[s] <= n && !v[s + c[s]]) {//边界判定
			dfs(s + c[s], sum + 1);
		}
		if (s - c[s] >= 1 && !v[s - c[s]]) {//边界判定
			dfs(s - c[s], sum + 1);
		}
		v[s] = 0;//记得复原
	}
}

切记几个“良心提醒

1.因为求最小,所以ans初始化要很大

ans = 99999999

Like this

2.如果没有找到答案,还要记住一个判定来判断

if (ans == 99999999) {
	cout << -1;
	return 0;
}

想要完整代码

都给到这个分儿上了!

没门!!!


[ END ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值