传送门

题目链接:https://ac.nowcoder.com/acm/contest/103867/E

题意:

在数组上移动每次可以往左或往右一格,或者通过传说门移动,求到达n的最小移动次数

思路:

隐式图BFS问题
注意vis数组的使用

int n;
int a[maxn];
int vis[maxn];
map<int,vector<int>>mp;
set<int>stt;
int bfs(pii st){
	queue<pii>q;
	q.push(st);
	while(q.size()){
		int now=q.front().fi;
		vis[now]=1;
		int step=q.front().se;
		if(now==n){
			return step;
		}
		q.pop();
		if(now+1<=n&&!vis[now+1])q.push({now+1,step+1});
		if(now-1>=1&&!vis[now-1])q.push({now-1,step+1});
		if(!stt.count(a[now])){
		for(int j=0;j<mp[a[now]].size();j++){
			if(j==now)continue;
			if(!vis[mp[a[now]][j]])q.push({mp[a[now]][j],step+1});
		}
		stt.insert(a[now]);
		}
	}
	return -1;
}

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		mp[a[i]].pb(i);
	} 
	int ans=bfs({1,0});
	cout<<ans<<endl;
}
posted @ 2025-04-09 22:12  Marinaco  阅读(31)  评论(0)    收藏  举报
//雪花飘落效果