X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

简介: X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3…

当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为6时,开始情形如下:

1 2 3 4 5 6

12 11 10 9 8 7

13 14 15 …

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)

输入为3个整数w m n,空格分开,都在1到10000范围内

要求输出一个整数,表示m n 两楼间最短移动距离。

[样例输入]

6 8 2

[样例输出]

4

[样例输入]

4 7 20

[样例输出]

5

*/

方法一:(思维简单,但比较麻烦,执行速度慢)

package 蓝桥;
import java.util.Scanner;
public class lou {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int tamp=scanner.nextInt();
    int n,m,sum=0;
    n=scanner.nextInt();
    m=scanner.nextInt();
    int[][] a=new int[10000/tamp+10][tamp];
    int x=-1,y=0,o=1;
    for (int i = 1; i <= 10000; i++) {
      x+=o;
      //System.out.println(y+"   "+x);
      a[y][x]=i;
      if((x==0||x==tamp-1)&&i!=1)
      {
        o=-o;
        y++;
        i++;
        //System.out.println(y+"   "+x);
        a[y][x]=i;
      }
    }
    x=y=-99;
    int x2=-99,y2=-99;
    for (int i = 0; i < ((10000/tamp)+1); i++) {
      for (int j = 0; j <tamp ; j++) {
        if (a[i][j]==n) {
          x=i;
          y=j;
          break;
        }
      }
      if (x!=-99&&y!=-99) {
        break;
      }
    }
    for (int i = 0; i < ((10000/tamp)+1); i++) {
      for (int j = 0; j <tamp ; j++) {
        if (a[i][j]==m) {
          x2=i;
          y2=j;
          break;
        }
      }
      if (x2!=-99&&y2!=-99) {
        break;
      }
    }
    sum=Math.abs(x-x2)+Math.abs(y-y2);
    System.out.println(sum);
  }
}

方法二:(找规律,速度快)

package 蓝桥;
import java.util.Scanner;
public class lou {
  public static void main(String[] args) {
    Scanner scanner=new Scanner(System.in);
    int tamp=scanner.nextInt();
    int n,m,sum=0;
    n=scanner.nextInt();
    m=scanner.nextInt();
    sum+=Math.abs((n+tamp-1)/tamp-(m+tamp-1)/tamp);
    int x=(n%tamp);
    int y=(m%tamp);
    if (((n+tamp-1)/tamp)%2==0&&x!=0) {
      x=tamp-x+1;
    }
    else if (x==0) {
      x=1;
    }
    if (((m+tamp-1)/tamp)%2==0&&y!=0) {
      y=tamp-y+1;
    }
    else if (y==0) {
      y=1;
    }
    sum+=Math.abs(x-y);
    System.out.println(sum);
  }
}

           


相关文章
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
50 0
|
3月前
|
数据可视化 数据挖掘 数据处理
Python实现数字按三角形排列
Python实现数字按三角形排列
30 4
|
7月前
|
算法
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
现有‘abcdefghijkl’12个字符,将其所有的排列按字典序进行排序,给出任意一组排列,说出这租排列在所有排列中是第几小的
70 1
|
人工智能 BI
牛客 序列排列1
牛客 序列排列1
71 0
|
8月前
|
算法 搜索推荐
每日一题——下一个排列
每日一题——下一个排列
|
算法 索引
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
【基础算法】浅浅刷个小题 # 搜索插入位置 # 各位相加 # 寻找数组的中心下标 #
|
C++
C++ leetcode之排列与组合专题
C++ leetcode之排列与组合专题
93 0
|
索引
每日三题-下一个排列、颜色分类、寻找重复数
每日三题-下一个排列、颜色分类、寻找重复数
86 0
每日三题-下一个排列、颜色分类、寻找重复数
|
算法 索引
LeetCode每日一题——1252. 奇数值单元格的数目
给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。
94 0
LeetCode每日一题——1252. 奇数值单元格的数目
|
前端开发
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)
伪类用于定义元素的特殊状态。 例如,它可以用于:设置鼠标悬停在元素上时的样式,为已访问和未访问链接设置不同的样式,设置元素获得焦点时的样式
255 0
伪类选择器设置奇偶数标签(1+X Web前端开发 例题)