1 条题解
-
4
不是说简单题吗,咋还冒出提高组得了。 AC代码
#include <bits/stdc++.h> using namespace std; int n,k; struct T{ int x; int step; }q[100001]; int vis[100001]; void bfs(int sx,int ex){ int head=1; int tail=1; q[tail].x=sx; q[tail].step=0; tail++; vis[sx]=1; while(head<tail){ int x0=q[head].x; int step=q[head].step; if (x0==ex){ cout<<step<<endl; return; } for (int i=1;i<=3;i++){ int nx; if (i==1){ nx=x0+1; } if (i==2){ nx=x0-1; } if (i==3){ nx=x0*2; } if (nx>=0&&nx<=100000&&!vis[nx]){ q[tail].x=nx; q[tail].step=step+1; tail++; vis[nx]=1; } } head++; } } int main(){ cin>>n>>k; memset(vis,0,sizeof(vis)); bfs(n,k); return 0; }
优化
#include <bits/stdc++.h> using namespace std; const int maxn=1000001; int step=0; void bfs(int sx,int ex){ set<int>q1; set<int>q2; set<int>visted; set<int>tmp; q1.insert(sx); q2.insert(ex); while(q1.size()&&q2.size()){ tmp.clear(); for (set<int>::iterator it=q1.begin();it!=q1.end();it++){ int cur=*it; if (q2.find(cur)!=q2.end()){ cout<<step<<endl; return; } visted.insert(cur); for (int i=1;i<=3;i++){ int nc=cur; if (i==1){ nc++; } if (i==2){ nc--; } if (i==3){ if (step%2!=0){ if (nc%2==0){ nc/=2; } else{ continue; } } else{ nc*=2; } } if (nc>=0&&nc<=100000&&visted.find(nc)==visted.end()){ tmp.insert(nc); } } } step++; q1=q2; q2=tmp; } } int main(){ int n,k; cin>>n>>k; bfs(n,k); return 0; }
- 1
信息
- ID
- 2051
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 161
- 已通过
- 77
- 上传者