【问题描述】
-
题目8、移动距离
-
题目描述
-
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范围内
-
w为排号宽度,m,n为待计算的楼号。
-
要求输出一个整数,表示m n 两楼间最短移动距离。
-
例如:
-
用户输入:
-
6 8 2
-
则,程序应该输出:
-
4
-
再例如:
-
用户输入:
-
4 7 20
-
则,程序应该输出:
-
5
【解题思路】
把整个1000个编号当成一个二维数组来打印出来,最短的距离就相当于是两个数的位置的坐标相减,
因为距离是大于0的,所以结果取绝对值,详细过程看代码注释
【代码】
package com.hopu.真题.第六套;
import java.util.Scanner;
public class T8_移动距离 {
public static void main(String[] args) {
//接收传过来的值
Scanner sc=new Scanner(System.in);
int w=sc.nextInt();
int m=sc.nextInt();
int n=sc.nextInt();
//将整个1000个楼房的编号当成一个矩阵打印出来
int line=0;//矩阵的行
//判断它有多少行
if (1000%w==0){
line=1000/w;
}else {
line=1000/w+1;
}
int[][] nums=new int[line][w];//定义一个二维数组
int k=1;//k表示二维数组添加的值,k一直要++
//循环打印这个矩阵
int ll=0,rr=0;//ll表示当前正在打印的行,rr表示当前正在打印的列
boolean bo=true;//为true时从左向右打印,为false时从右往左打印
L:
while (ll<line&&rr<w){
while (rr<w&&bo){
nums[ll][rr++]=k++;
}
rr--;
ll++;
if (ll==line){
break L;
}
bo=false;
while (rr>=0&&!bo){
nums[ll][rr--]=k++;
}
rr=0;
ll++;
bo=true;
}
//定义4个参数,表示m和n的坐标,m和n之间的最短移动距离就是两个坐标相减的绝对值
int x1=0,x2=0,y1=0,y2=0;
//定义两个变量判断m和n是否被找到
boolean boo1=false;
boolean boo2=false;
for (int i = 0; i < line; i++) {
for (int j = 0; j < w; j++) {
if (nums[i][j]==m){
x1=i;
y1=j;
boo1=true;//找到就为true
}
if (nums[i][j]==n){
x2=i;
y2=j;
boo2=true;//找到就为true
}
if (boo1&&boo2){//只有两个坐标同时被找到时,才能相减
int cc=Math.abs(x1-x2)+Math.abs(y1-y2);
System.out.println(cc);//输出最短距离
return;
}
}
}
}
}