看懂意思就很简单了,给你一个数,每次只能加一或者减一或者乘2,问最少几次才能变成另一个数,就是一个简单的bfs过程,看代码吧。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 100005;
struct Node{
int x,step;
}Now,Next,S,E;
bool vis[MAXN]; // 用于标记这个数是否出现过
int bfs(){
queue<Node> q;
memset(vis,0,sizeof(vis));
S.step = 0;
q.push(S);
while(!q.empty()){
Now = q.front();
q.pop();
if(Now.x == E.x){ // 结束的时候返回步数
return Now.step;
}
for(int i=0;i<3;i++){ // 模拟变换过程
if(i==0){
Next.x = Now.x + 1;
}
else if(i==1){
Next.x = Now.x - 1;
}
else{
Next.x = Now.x * 2;
}
if(Next.x >= 0 && Next.x <= 100000 && vis[Next.x] == 0){
vis[Next.x] = 1;
Next.step = Now.step + 1;
q.push(Next);
}
}
}
return -1;
}
int main()
{
while(~scanf("%d%d",&S.x,&E.x)){
int temp = bfs();
printf("%d\n",temp);
}
return 0;
}
/***
[来源] POJ 3278
[题目] Catch That Cow
[大意]
给你两个数n,m,n每次只能加一或者减一或者乘以2,问最少需要多少次才能变成m
[输入]
5 17
[输出]
4
*/