概述
第十三届蓝桥杯【蜂巢】最简单的解法
- 题目:
- 思路
- 总共有六个方向如下,可以按如下图方式作为x轴(这里的方向标反了,标的方向是x轴的负方向)和y轴:
- 此时六个方向 0 − 5 0-5 0−5 可以用如下数组操作:
i n t [ ] [ ] d i r s = n e w i n t [ ] [ ] − 1 , 0 , − 1 , 1 , 0 , 1 , 1 , 0 , 1 , − 1 , 0 , − 1 ; int[][] dirs = new int[][]{{-1, 0}, {-1, 1}, {0, 1}, {1, 0}, {1, -1}, {0, -1}}; int[][]dirs=newint[][]−1,0,−1,1,0,1,1,0,1,−1,0,−1;
往 0 0 0方向,走x坐标减一;往 1 1 1 方向走,x坐标减一,y坐标加一;往 2 2 2方向走,y坐标加一;往 3 3 3 方向走,x坐标加1;往 4 4 4 方向走,则x坐标加一,y坐标减一;往 5 5 5方向走则y坐标减一。- 然后,我们现在只关心让第一个点 ( x 1 , y 1 ) (x1,y1) (x1,y1) 作为左边的点(例如图中 B B B 点),让第二点 ( x 2 , y 2 ) (x2,y2) (x2,y2) 为在右边的点(例如图中 C C C 点),然后我们只要考虑两种情况:
- 当第一个点在第二点左上方时,途中 B B B 和 C C C 点的位置关系,此时 B B B 点在坐标中的位置是 ( − 5 , 3 ) (-5,3) (−5,3),而 C C C点位置为 ( 2 , 1 ) (2,1) (2,1) ,从左上往右下走,x坐标在加,y坐标在减,故此时最短距离为 B B B从左上向右下走2步到达 ( − 3 , 1 ) (-3,1) (−3,1) ,再向右走5步就能到达 C C C点,此时有 a = M a t h . a b s ( − 5 − 2 ) = 7 , b = M a t h . a b s ( 3 − 1 ) = 2 a = Math.abs(-5-2)=7,b=Math.abs(3-1)=2 a=Math.abs(−5−2)=7,b=Math.abs(3−1)=2,故此时距离为 d i s = M a t h . m a x ( a , b ) = 7 dis = Math.max(a,b)=7 dis=Math.max(a,b)=7 ,即能得到此时两点的距离公式为 d i s t = M a t h . m a x ( M a t h . a b s ( x 1 − x 2 ) , M a t h . a b s ( y 1 − y 2 ) ) dist = Math.max(Math.abs(x1-x2), Math.abs(y1-y2)) dist=Math.max(Math.abs(x1−x2),Math.abs(y1−y2))。
- 当第一个点在第二个点左下方时,图中 O O O 点和 C C C 点的位置关系,此时 O O O 点坐标为 ( 0 , 0 ) (0, 0) (0,0) , C C C 点坐标为 ( 2 , 1 ) (2, 1) (2,1),此时 O O O 点到 C C C 点最短距离为 O O O 先向右走两步,再向上(Y)走一步到达 C C C ,此时有 a = M a t h . a b s ( 0 − 2 ) = 2 , b = M a t h . a b s ( 0 − 1 ) = 1 a = Math.abs(0-2)=2, b = Math.abs(0-1)=1 a=Math.abs(0−2)=2,b=Math.abs(0−1)=1,故此时距离为 d i s = a + b = 3 dis = a + b = 3 dis=a+b=3,即此时距离公式为 d i s t = M a t h . a b s ( x 1 − x 2 ) + M a t h . a b s ( y 1 − y 2 ) dist = Math.abs(x1-x2) + Math.abs(y1-y2) dist=Math.abs(x1−x2)+Math.abs(y1−y2)。
- 当第一个点在第二点的左方时放过来即可(比如 B B B 在 C C C 的右上方等价于 C C C 在 B B B 的左下方, B B B 在 C C C 的右下方等价于 C C C在 B B B 的左上方)。
- AC代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 65536);
static StringTokenizer tokenizer = new StringTokenizer("");
public static void main(String[] args) {
int[][] dirs = new int[][]{{-1, 0}, {-1, 1}, {0, 1}, {1, 0}, {1, -1}, {0, -1}};
int d1 = nextInt(); long p1 = nextLong(), q1 = nextLong();
int d2 = nextInt(); long p2 = nextLong(), q2 = nextLong();
long x1 = 0, y1 = 0, x2 = 0, y2 = 0;
x1 += p1 * dirs[d1][0] + q1 * dirs[(d1 + 2) % 6][0];
y1 += p1 * dirs[d1][1] + q1 * dirs[(d1 + 2) % 6][1];
x2 += p2 * dirs[d2][0] + q2 * dirs[(d2 + 2) % 6][0];
y2 += p2 * dirs[d2][1] + q2 * dirs[(d2 + 2) % 6][1];
System.out.println(getDistance(x1, y1, x2, y2));
}
public static long getDistance(long x1, long y1, long x2, long y2) {
if (x1 > x2) return getDistance(x2, y2, x1, y1); // 如果 (x1, y1)在右边,则翻转一下。
long a = Math.abs(x1 - x2), b = Math.abs(y1 - y2);
if (y1 >= y2) return Math.max(a, b); // 当第一个点在左上方时
return a + b; // 当第一个点在左下方时
}
private static String next() {
while (!tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return tokenizer.nextToken();
}
public static int nextInt() { return Integer.parseInt(next()); }
public static long nextLong() { return Long.parseLong(next()); }
}
最后
以上就是甜蜜纸鹤为你收集整理的第十三届蓝桥杯【蜂巢】最简单的解法的全部内容,希望文章能够帮你解决第十三届蓝桥杯【蜂巢】最简单的解法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复