码蹄集 --原题链接
解析:
BFS,每次只能前后,或者瞬移,并且每次消耗都为1,所以宽搜即可。
- #include
- using namespace std;
- const int N=2e5+5;
- int n,a[N],ne[N];
- int vis[N],res;
- map<int,int>mp;
- struct node{
- int x,k;
- };
- void bfs(){
- queue
q; - vis[1]=1;
- q.push({1,0});
- while(q.size()){
- node t=q.front();
- q.pop();
- if(t.x==n){
- res=t.k;
- return;
- }
- if(t.x+1<=n&&!vis[t.x+1]){
- vis[t.x+1]=1;
- q.push({t.x+1,t.k+1});
- }
- if(t.x-1<=n&&!vis[t.x-1]){
- vis[t.x-1]=1;
- q.push({t.x-1,t.k+1});
- }
- if(ne[t.x]<=n&&!vis[ne[t.x]]){
- vis[ne[t.x]]=1;
- q.push({ne[t.x],t.k+1});
- }
- }
- }
- signed main(){
- scanf("%d",&n);
- for(int i=1;i<=n;i++) scanf("%d",&a[i]);
- for(int i=n;i>0;i--){
- if(mp.count(a[i])) ne[i]=mp[a[i]];
- mp[a[i]]=i;
- }
- bfs();
- cout<
- return 0;
- }