P1135 奇怪的电梯

P1135 奇怪的电梯

DFS写法

#include<bits/stdc++.h>
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long 
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

using namespace std;

const int N = 200+10;

int n,A,B;
int va[N];
int vis[N];
int dis[N];
int minn = 1e18;

void dfs(int now,int sum)
{
	dis[now] = sum;//dis[i]表示走到i这个点最少要几步 
	if(minn<=sum) return ;
	if(sum>n) return ;
	if(now==B)
	{
		minn = min(minn,sum);
		return ;
	}
	int up = now+va[now];
	int down = now-va[now];
	if(up>=1&&up<=n&&vis[up]==0&&sum+1<dis[up])//up这个点可能已经走过了,如果发现有另一种走法可使得走到up这个点步数更小,才按最好的再走一遍 
	{
		vis[up] = 1;
		dfs(up,sum+1);
		vis[up] = 0;
	}
	if(down>=1&&down<=n&&vis[down]==0&&sum+1<dis[down])
	{
		vis[down] = 1;
		dfs(down,sum+1);
		vis[down] = 0;
	}
}

signed main()
{
	IOS;
   	cin>>n>>A>>B;
   	for(int i=1;i<=n;i++) cin>>va[i];
   	for(int i=1;i<=n;i++) dis[i] = 1e18;
   	dis[A] = 0;
   	vis[A] = 1;
   	dfs(A,0);
   	if(minn==1e18) minn = -1;
   	cout<<minn;
    return 0;
}

BFS写法

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

using namespace std;

const int N = 1e3+5;
int n,sta,edb;
int va[N];
int dist[N];
int vis[N];
void bfs()
{
	queue<int> q;//定 
	dist[sta] = 0;//时 
	vis[sta] = 1;//标 
	q.push(sta);//放 
	while(q.size()>=1)
	{
		auto now = q.front();
		q.pop();
		int up = now+va[now];
		int down = now-va[now];
		if(up>=1&&up<=n&&vis[up] ==0)
		{
			vis[up] = 1;
			dist[up] = dist[now]+1;
			q.push(up);
		}
		if(down>=1&&down<=n&&vis[down] ==0)
		{
			vis[down] = 1;
			dist[down] = dist[now]+1;	
			q.push(down);
		}
	}
}
int main()
{
	IOS;
	cin>>n>>sta>>edb;
	for(int i = 1;i<=n;i++) cin>>va[i];
	bfs();
	if(vis[edb] !=0)cout<<dist[edb];
	else cout<<-1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值