题意:起点为 n,终点为 k。运动有三个方向:n-1,n+1,2*n。最少几步到达 k 点。
思路:BFS 三个方向。额外要注意的是剪枝和 n 等于 k 时答案应为 0。
#include<iostream> #include<cmath> #include<queue> #include<cstring> #include<string> #include<cstdio> #include<algorithm> using namespace std; const int maxx = 100005; int n, k, ans, next; bool vis[maxx]; //标记是否访问过 struct point{ int x, n; //x为坐标,n为布数 }; void bfs(){ if(n == k){ ans = 0; return; } queue<point> q; point p1; p1.x = n; p1.n = 0; q.push(p1); vis[n] = 1; while(!q.empty()){ point p2 = q.front(); q.pop(); for(int i = 0; i < 3; i++){ if(!i) next = p2.x + 1; else if(i == 1) next = p2.x - 1; else next = 2*p2.x; if(next < 0 || next > maxx) continue; //剪枝 if(next == k){ ans = p2.n+1; return; } if(!vis[next]){ point p3; p3.x = next; p3.n = p2.n+1; q.push(p3); vis[next] = 1; } } } } int main(){ //freopen("a.txt", "r", stdin); while(scanf("%d %d", &n, &k) != EOF){ memset(vis, 0, sizeof(vis)); bfs(); cout << ans << endl; } return 0; }