P1135 奇怪的电梯

发布时间 2023-06-07 21:31:20作者: jiangchenyangsong

2021-03-08

思路:dfs

没有越界就继续搜下去

#include<bits/stdc++.h>
using namespace std;
int n,a,b,ans=1e9;
int t[205],v[205];//t[i]表示在i层时可以上下的层数  v[i]存储在当前走法下i层是否经过    0--未走过 1--已走过 
void dfs(int floor,int k) {
	if(floor==b)
		ans=min(k,ans);//如果到达B层,选取最小值
	if(k>ans)
		return ; //如果当前K大于ans,就不用考虑了这个走法了
	//向上 
	if(floor+t[floor]<=n&&!v[floor+t[floor]]) { //考虑是否越界或floor+t[floor这个层数已走过
		v[floor]=1;    //标记floor层已走过   如果未标记,可能会重复来到这层,陷入死循环 
		dfs(floor+t[floor],k+1);
	}
	//向下
	if(floor-t[floor]>=0&&!v[floor-t[floor]]) {
		v[floor]=1;
		dfs(floor-t[floor],k+1);
	}
	v[floor]=0;//回溯 
}
int main() {
	
	scanf("%d%d%d",&n,&a,&b);
	for(int i=1; i<=n; i++)
		scanf("%d",&t[i]);
	v[a]=1;//把当前A层标记为已走过 
	dfs(a,0);
	if(ans!=1e9)
		printf("%d\n",ans); //如果ans值不变,说明从A层无法到B层
	else
		printf("-1\n");
	return 0;
}

完结撒花