题意:给你两个数n, k。有三种操作
1 n+1
2 n-1
3 n*2
问通过几次操作后n表位
又是类似于最短距离的题,用bfs
当n>k时只能进行2操作。
当n<k时可以进行1,2,3操作(1和3操作好理解为什么可以进行2操作比如5->4->8)
敲代码前一定要把全部情况考虑到位,别漏掉了一些
#include
#include
#include
#include
using namespace std;
const int N = 1000001;
int n, m;
int ans = 0;
bool flag[N];
struct node
{
int x; //记录数
int step; //步数
node(){}
node(int xx, int ss)
{
x = xx; step = ss;
}
};
queue
que; void solve() { while(!que.empty()) que.pop(); que.push(node(n, 0)); memset(flag, 0, sizeof(flag)); flag[n] = 1; while(!que.empty()) { node tmp = que.front(); que.pop(); if(tmp.x > m)//大于m只能减 { if(tmp.x-1 == m) {ans = tmp.step+1;return;} if(!flag[tmp.x-1]) { que.push(node(tmp.x-1, tmp.step+1)); flag[tmp.x-1] = 1; } } else//小于可以减,可以乘二,可以加一 { if(tmp.x+1 == m || tmp.x*2 == m) {ans = tmp.step+1;return;} if(!flag[tmp.x+1]) { que.push(node(tmp.x+1, tmp.step+1)); flag[tmp.x+1] = 1; } if(tmp.x*2 <= 2*m && !flag[tmp.x*2])//5->10->9 { que.push(node(tmp.x*2, tmp.step+1)); flag[tmp.x*2] = 1; } if(tmp.x-1 >= 0 && !flag[tmp.x-1]) { que.push(node(tmp.x-1, tmp.step+1)); flag[tmp.x-1] = 1; } } } } int main(void) { while(~scanf("%d%d", &n, &m)) { if(n == m) {printf("0\n");continue;} solve(); printf("%d\n", ans); } return 0; }