hdu-2717(基礎搜索bfs)
阿新 • • 發佈:2018-03-10
pan push n-1 ostream nbsp 三個點 sin 兩種 入隊
題意:給你n和k,問你n最少花費多少代價能得到k;
有兩種變換:1、n++或者n--;
2、n=n*2;
兩種代價每次的花費都是1;
思路:一維的bfs,每次入隊三個點,一個是n+1,一個是n-1,一個是n*2的點;
#include<iostream> #include<algorithm> #include<cstring> #include<queue> #define maxn 100020 using namespace std; int step[maxn*2]; int visit[maxn*2]; int main() { queue<int>q; int n,k; while(cin>>n>>k) { if(n>k) cout<<n-k<<endl; else if(n==k) { cout<<"0\n"; } else { memset(visit,0,sizeof(visit)); memset(step,0,sizeof(step)); visit[n]=1;step[n]=0;int flag=0; while(!q.empty()) { q.pop(); } q.push(n); while(!q.empty()) { int temp=q.front(); q.pop(); int now;//cout<<"z\n"; for(inti=1;i<=3;i++) { if(i==1) now=temp+1; else if(i==2) now=temp-1; else now=temp*2; if(visit[now]==0&&now<=maxn&&now>=0) { q.push(now); step[now]=step[temp]+1; visit[now]=1; } if(now==k) { cout<<step[now]<<endl;flag=1; break; } } if(flag==1) break; } } } return 0; }
hdu-2717(基礎搜索bfs)