输入n,A,B,输出A到B的最少步数
三种走法:顺序不变,走过的不走,并且不超出n的范围。
1.向前走,+1
2.向后走,-1
3.跳跃走,*2
题解:看注释。
注意:此地方用到了pair<int,int> ,相当于结构体node的两个整型变量,用时需要用make_pair()插入一组数据,访问时需要用.first和.second,访问第一个和第二个数据。
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
#define maxn 10005
#define mod 7654321
bool vis[maxn];//标记
struct node
{
int now,step;//当前位置,步数
node(int x,int y)
{
now=x;
step=y;
}
};
queue<pair<int,int> > q;//pair<int,int>相当于node,用的时候需要用到make_pair();
queue<node> p;
int main()
{
int n,A,B,now,step;
cin>>n>>A>>B;
q.push(make_pair(A,0));//放入起始位置
vis[A]=true;//标记为用过
while(!q.empty())
{
now=q.front().first;//pair的访问方法
step=q.front().second;
q.pop();
if(now==B)//找到终点输出步数后退出
{
cout<<step<<endl;
break;
}
if(now+1<=n&&!vis[now+1])
{
q.push(make_pair(now+1,step+1));//压入
vis[now+1]=true;//标记
}
if(now-1<=n&&!vis[now-1])
{
q.push(make_pair(now-1,step+1));
vis[now-1]=true;
}
if(now*2<=n&&!vis[now*2])
{
q.push(make_pair(now*2,step+1));
vis[now*2]=true;
}
}
return 0;
}