文章

4

粉丝

140

获赞

8

访问

35.4k

头像
奇怪的电梯1072
推荐阅读
P1072
发布于2021年5月28日 23:04
阅读数 7.0k

DFS(递归)搜索

#include<bits/stdc++.h>
using namespace std;
void DFS(vector<int> &elevator, int index, int time, int Bindex, vector<int> &times){// down为向下的层,up为向上的层 
	time++;//多按一次按钮 
	//终止条件
	if(times[index] != -1 && times[index] <= time || index < 0 || index > elevator.size()-1)return ;//下标超限或当前到达该层的次数不少于times所记录的次数,此路肯定不是最短次数 
	times[index] = time;//更新到达该层的最少次数 
	if(index == Bindex)return ;//到达B,不用再往下找了 
	 
	DFS(elevator, index-elevator[index], time, Bindex, times);//向下
	DFS(elevator, index+elevator[index], time, Bindex, times);//向上 
	
	return ;
}
int main(){
	int N = 0, A = 0, B = 0;
	cin >> N >> A >> B;
	int i = 0, num = 0;
	vector<int> elevator;//电梯 
	while(i < N){
		cin >> num;
		elevator.push_back(num);
		i++;
	}
	/* 
		DFS + 剪枝 
		由于同一层可能多次访问,所以干脆设置一个times数组记录从A到每层所需的最少次数,
		一旦遍历到该层判断当前次数是否已经不小于times中所记录的次数	,说明此路径肯定不是最少次数,终止。 
	*/
	vector<int> times(N, -1);//记录从A到...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发