题目链接:http://poj.org/problem?id=3278
题目大意:给出两个数n,k;经过两种操作使n成为k所需要的步数;操作1:n=n+1或n=n-1;操作2:n=n×2;
解题思路:用bfs搜索,vis数组标记状态同时记录到当前位置所用的步数;
代码:
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
int n,k;
int vis[100005];
void bfs()
{
queue<int>q;
while(!q.empty()) q.pop();
q.push(n);
vis[n]=0;
while(!q.empty())
{
int temp=q.front();
q.pop();
if(temp==k) return;
int now;
now=temp-1;
if(now>=0&&now<100005&&vis[now]==-1)
{
vis[now]=vis[temp]+1;
q.push(now);
}
now=temp+1;
if(now>=0&&now<100005&&vis[now]==-1)
{
vis[now]=vis[temp]+1;
q.push(now);
}
now=temp*2;
if(now>=0&&now<100005&&vis[now]==-1)
{
vis[now]=vis[temp]+1;
q.push(now);
}
}
}
int main()
{
while(cin>>n>>k)
{
memset(vis,-1,sizeof(vis));
bfs();
cout<<vis[k]<<endl;
}
return 0;
}