想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:
输入两个数n,k两个数,问从n到k最少经过多少步,对于一个数x有三种走法,x-1,x+2,2*x
代码:
#include <iostream> #include <queue> using namespace std; #define MAXV 200000 int key[MAXV]; bool dis[MAXV]; int bfs(int first,int last){ int v; queue <int>q; memset(dis,false,sizeof(dis)); memset(key,0,sizeof(key)); q.push(first); key[first]=0; dis[first]=true; while(!q.empty()){ v=q.front(); q.pop(); if(v==last) return key[v]; if((v-1)>=0 && (v-1)<MAXV && !dis[v-1]) {key[v-1]=key[v]+1;dis[v-1]=true;q.push(v-1);} if((v+1)>=0 && (v+1)<MAXV && !dis[v+1]) {key[v+1]=key[v]+1;dis[v+1]=true;q.push(v+1);} if((v*2)>=0 && (v*2)<MAXV && !dis[2*v]) {key[v*2]=key[v]+1;dis[v*2]=true;q.push(v*2);} } } int main(){ int n,k; while(scanf("%d%d",&n,&k)!=EOF){ printf("%d\n",bfs(n,k)); } return 0; }