题意:输入n,m,求由n到m需要最少步数,n只能加一减一或者乘二。
写的第二道广搜题,发现用队列就是每一种可能读入队尾,然后再从队首一个一个的遍历。
需要做的是判断条件和记录步数。
#include<iostream>
using namespace std;
#include<cstdio>
#include<queue>
#include<cstring>
#define M 200000
int key[M];
int visit[M];
int bfs(int first,int last)
{
int t;
queue<int >q;
memset(visit,false,sizeof(visit));
q.push(first);
key[first] = 0;
visit[first] = true;
while(!q.empty()){
t = q.front();
q.pop();
if(t == last)
return key[t];
if((t - 1) >= 0 && (t - 1) < M && !visit[t - 1]){ //注意括号
key[t - 1] = key[t] + 1;
visit[t - 1] = true;
q.push(t - 1);
}
if((t + 1)>= 0 && (t + 1) < M && !visit[t + 1]){
key[t + 1] = key[t] + 1;
visit[t + 1] = true;
q.push(t + 1);
}
if((t*2) >= 0 && (t*2) < M && !visit[t*2]){
key[t*2] = key[t] + 1;
visit[t*2] = true;
q.push(t*2);
}
}
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
printf("%d\n",bfs(n,m));
}
return 0;
}