【BFS】迷之阶梯

在这里插入图片描述

思路

BFS

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
bool Flag[225]={0},F[225][225];
//Flag表示i点是否走过
//F表示i点后退j步有没有走过
int m,Height[500];
int main()
{
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
		scanf("%d",&Height[i]);
	queue<int>Ladder;//表示第几个台阶
	queue<int>Step;//表示可以上多高的台阶
	queue<int>Back;//表示后退了多少步
	queue<int>Num;//表示用了多少步
	Ladder.push(1);
	Step.push(1);
	Back.push(0);
	Num.push(0);
	Flag[1]=1;
	while(Ladder.size())
    {
    	int L=Ladder.front();Ladder.pop();
    	int S=Step.front();Step.pop();
    	int B=Back.front();Back.pop();
    	int N=Num.front();Num.pop();
    	for(int i=L+1;i<=m;++i)//前进
			if(Height[L]+S>=Height[i] 
			&& !Flag[i])
			{
				Ladder.push(i);
				Num.push(N+1);
				Step.push(1);
				Back.push(0);
				Flag[i]=1;
				if(i==m)
				{
					printf("%d",N+1);
					return 0;
				}
			}
        if (!F[L-1][B+1] && L>1)//后退
		{
			Ladder.push(L-1);
			Step.push(2*S);
			Back.push(B+1);
			Num.push(N+1);
			F[L-1][B+1]=1;
		}
	}
	printf("-1\n");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/89025862