问题描述
在一个长度为 n 的坐标轴上,蒜头君想从 A 点 移动到 B 点。他的移动规则如下:
向前一步,坐标增加 1。\n向后一步,坐标减少 1。\n跳跃一步,使得坐标乘 2。
蒜头君不能移动到坐标小于 0 或大于 n 的位置。蒜头想知道从 A 点移动到 B 点的最少步数是多少,你能帮他计算出来么?
输入格式\n第一行输入 n, m 表示迷宫大小。(1≤n,m≤100)\n接下来输入 n 行字符串表示迷宫,每个字符串长度为 m。(地图保证有且仅有一个终点,一个起始点)
输出格式
第一行输入三个整数 n,A,B,分别代表坐标轴长度,起始点坐标,终点坐标。(50000≤A,B≤n≤5000)
样例输入
10 2 7
样例输出
3
#include <iostream> #include <queue> using namespace std; int n,A,B; //n坐标长度,A起始坐标,B终点坐标 bool c[5005]; struct node{ int x; int t; node(int xx,int tt){ x=xx; t=tt; } }; bool in(int x){ return x>=0 && x<=n; } queue<node> q; int main(){ cin>>n>>A>>B; q.push(node(A,0)); c[A]=true; while(!q.empty()){ node a=q.front(); q.pop(); int xx=a.x; int tt=a.t; if(xx==B){ cout<<tt; break; } if(in(xx-1) && !c[xx-1]){ c[xx-1]=1; q.push(node(xx-1,tt+1)); } if(in(xx+1) && !c[xx+1]){ c[xx+1]=1; q.push(node(xx+1,tt+1)); } if(in(xx*2) && !c[xx*2]){ c[xx*2]=1; q.push(node(xx*2,tt+1)); } } return 0; }