传送门
题目链接: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;
}

浙公网安备 33010602011771号