题目描述:

样例输入
1 89
样例输出
9
代码:
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define _for(i,a,b) for(int i=a;i<b;i++)
#define _unfor(i,a,b) for(int i=a;i>=b;i--)
#define RI(a) scanf("%d",&a)
#define mset(a,val,n) for(int i=0;i<n;i++)a[i]=val;
#define mset2(a,val,n,m) for(int i=0;i<n;i++)for(int j=0;j<m;j++)a[i][j]=val;
#define FI freopen("D:\\in.txt","r",stdin)
#define FO freopen("D:\\out.txt","w",stdout)
using namespace std;
typedef long long LL;
int N,K;
const int MAXN = 100000;
int visited[MAXN+10];
struct Step
{
int x;
int steps;
Step(int xx,int s):x(xx),steps(s) {}
};
queue<Step> q;
int main()
{
cin >> N >> K;
memset(visited,0,sizeof(visited));
q.push(Step(N,0));
visited[N] = 1;
while(!q.empty())
{
Step s = q.front();
if( s.x == K )
{
cout << s.steps <<endl;
return 0;
}
else
{
if( s.x - 1 >= 0 && !visited[s.x-1] )
{
q.push(Step(s.x-1,s.steps+1));
visited[s.x-1] = 1;
}
if( s.x + 1 <= MAXN && !visited[s.x+1] )
{
q.push(Step(s.x+1,s.steps+1));
visited[s.x+1] = 1;
}
if( s.x * 2 <= MAXN &&!visited[s.x*2] )
{
q.push(Step(s.x*2,s.steps+1));
visited[s.x*2] = 1;
}
q.pop();
}
}
return 0;
}
解析:
1、关于 queue 的基本函数
queue | 功能 |
---|
size() | 返回队列中的元素个数 |
front() | 返回队头的元素 |
back() | 返回队尾元素 |
pop() | 删除队头的元素 |
push(g) | 向队尾中添加元素 g |
empty() | 在队列没有元素时返回 true |
其用法与 vector 类似,可参考 C++ STL库 容器与方法 中的 Vector 容器
2、由于在 C++ 中 struct 和 class 最主要的区别是默认访问权限和继承方式不同,而其他方面的差异很小,所有在算法竞赛中使用较为简单的 struct
3、其实代码整体上的 queue< Step> q 中可以理解为只有两个元素(Step),一个是从一开始加入的,另一个是用于搜索的,而这个用于搜索的是根据队列的第一个 Step 改进而成的,当改完后用 q.pop()删除第一个 Step,自己就成为了第一个 Step,并继续第二轮搜索,直到找到目标