POJ3278http://poj.org/problem?id=3278
题目大意: m,n两个数m可+1, -1, *2变成n,需要经过几步
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<queue> #define max(a, b)(a > b ? a : b) #define N 100010 using namespace std; struct node { int x, step; }; int m, n; bool vis[N]; int judge(int x) { if(x <= 100000 && x >= 0 && !vis[x]) return 1; return -1; } int BFS(int x) { queue<node>Q; node now, next; now.x = x; now.step = 0; vis[now.x] = true; Q.push(now); while(!Q.empty()) { now = Q.front(); Q.pop(); if(now.x == n) return now.step; next.x = now.x + 1; if(judge(next.x) == 1) { vis[next.x] = true; next.step = now.step + 1; Q.push(next); } next.x = now.x - 1; if(judge(next.x) == 1) { vis[next.x] = true; next.step = now.step + 1; Q.push(next); } next.x = now.x * 2; if(judge(next.x) == 1) { vis[next.x] = true; next.step = now.step + 1; Q.push(next); } } return -1; } int main() { while(scanf("%d%d", &m, &n)!= EOF) { memset(vis, false, sizeof(vis)); printf("%d\n", BFS(m)); } return 0; }