文章
4
粉丝
140
获赞
8
访问
37.1k
DFS(递归)搜索
#include<bits/stdc++.h>
using namespace std;
void DFS(vector<int> &elevator, int index, int time, int Bindex, vector<int> ×){// 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到...
登录后发布评论
暂无评论,来抢沙发