BFS:一维坐标的移动

简介: BFS:一维坐标的移动

问题描述


在一个长度为 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;
} 
相关文章
|
4月前
二维前缀和
二维前缀和
15 0
|
5月前
|
存储 人工智能 算法
二维差分与二维前缀和
二维差分与二维前缀和
55 3
|
5月前
|
算法
算法题—顺时针打印矩阵
算法题—顺时针打印矩阵
45 0
|
5月前
|
Java
【剑指offer】-顺时针打印矩阵-19/67
【剑指offer】-顺时针打印矩阵-19/67
|
5月前
|
C++ 容器
[C++] 对二维数组中的二维坐标点x,y进行排序
[C++] 对二维数组中的二维坐标点x,y进行排序
178 0
|
5月前
|
算法 程序员 索引
【算法训练-动态规划 四】【二维DP问题】最大正方形、最小路径和、不同路径
【算法训练-动态规划 四】【二维DP问题】最大正方形、最小路径和、不同路径
98 0
给定三个顶点的坐标使用程序计算三角形
给定三个顶点的坐标使用程序计算三角形
57 0
剑指offer 28. 顺时针打印矩阵
剑指offer 28. 顺时针打印矩阵
49 0
|
人工智能 Java 算法框架/工具
二维前缀和数组&二维差分数组
二维差分数组div中的每一个格子记录的是「以当前位置为区域的左上角(区域右下角恒定为原数组的右下角)的值的变化量」【应该不固定 可以倒转】
343 0
二维前缀和数组&二维差分数组
|
Python
LeetCode 1572. 矩阵对角线元素的和
给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。
113 0