(簡單)佇列加搜尋
阿新 • • 發佈:2018-12-22
這道題,一看就知道是搜尋題。但它有三條選擇的方式移動,那麼我們就可以運用佇列的知識進行暴力的搜尋(因為必定對找到出口)。 #include<cstdio> #include<queue> #include<cstring> #include<cmath> using namespace std; int a[200010]; struct P //定義一個結構體存當前的點和到這個點的最少步數 { int n,x; }; int main() { int n,k; while(~scanf("%d%d",&n,&k)) { if(n==k) printf("0\n"); else if(n>k) printf("%d\n",n-k); else { memset(a,0,sizeof(a)); queue <P> q; P p; p.n=n; p.x=0; q.push(p); a[n]=1; while(1) //因為必定會找到出口,所以用while(1) { int t=q.front().n; //每次用隊首元素進行搜素 if(t+1==k||t-1==k||2*t==k){ printf("%d\n",q.front().x+1); break; } if( t>0 &&a[t-1]==0 ) { a[t-1]=1; p.n=t-1; p.x=q.front().x+1; q.push(p); } if( t<100001 && a[t+1]==0 ) { a[t+1]=1; p.n=t+1; p.x=q.front().x+1; q.push(p); } if(2*t<100001 && a[t*2]==0 ) { a[t*2]=1; p.n=t*2; p.x=q.front().x+1; q.push(p); } q.pop(); } } } return 0; }