1253:抓住那头牛
这题居然是一维的!
但是笔者窃以为难度并没有比二维的低。
由于N的取值比较大(100000),为避免全数轴确定最短路径(数值),
这里加了一个限制条件 !a[k]||a[y]<a[k] 。
这样就能有效避免多余的求值。
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 6 const int N=100005; 7 int k,a[N]; 8 queue<int> q; 9 10 void check(int x,int y){ 11 if(x>=0&&x<N&&(!a[x]||a[x]>a[y]+1)&&(!a[k]||a[y]<a[k])){ 12 a[x]=a[y]+1; 13 q.push(x); 14 } 15 } 16 void bfs(){ 17 while(!q.empty()){ 18 int x=q.front(); 19 q.pop(); 20 check(x-1,x); 21 check(x+1,x); 22 check(2*x,x); 23 } 24 } 25 int main(){ 26 int n; 27 cin>>n>>k; 28 q.push(n); 29 //i表示位置,a[i]表示到位置i所需的最短时间 30 a[n]=1,bfs(); 31 printf("%d\n",a[k]-1); 32 return 0; 33 }