题目:如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9。
给出整点坐标 (X,Y),你能计算出 dis(X,Y) 吗?
输入描述
输入格式:
输入一行,X 和 Y ,−109≤X,Y≤109。
输出描述
输出 dis(X,Y)。
输入输出样例
示例
输入
0 1
输出
3
解题思路+代码:(引用题解区 作者:番了个薯 题解代码:番了个薯 题解图片:别优化了哥暴力就完了)
代码:
java">import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);long x = sc.nextLong();long y = sc.nextLong();long n = Math.max(Math.abs(x), Math.abs(y));long k = 4 * n * n; // (n * 2) * (n * 2)if (x >= y) {System.out.println(k + (Math.abs(n - x) + Math.abs(n - y)));} else {System.out.println(k - (Math.abs(n - x) + Math.abs(n - y)));}}
}
个人的解题思路+代码:(不知道为什么按照螺旋的方向和观察出的螺旋步长规律编写,只能对50%的用例)
代码:
java">import java.util.Scanner;public class Main {public static void main(String[] args) {/**思路:1.确定好螺旋折线的方向原点(0,0)开始2.螺旋方向:左 ->上->右 ->下3.螺旋步长规律:1 1 2 2 3 3 4 4*/Scanner scan = new Scanner(System.in);int targetX = scan.nextInt(); // 目标点 Xint targetY = scan.nextInt(); // 目标点 Yscan.close();// 方向数组(左、上、右、下)int[] dx = {-1, 0, 1, 0};int[] dy = {0, 1, 0, -1};int curX = 0, curY = 0; // 当前坐标int direction = 0; // 方向索引(0=左, 1=上, 2=右, 3=下)int stepLength = 1; // 当前步长int totalSteps = 0; // 记录总步数int stepChangeCount = 0; // 记录改变方向的次数while (true) {for (int i = 0; i < stepLength; i++) {curX += dx[direction];curY += dy[direction];totalSteps++;// 到达目标点if (curX == targetX && curY == targetY) {System.out.println(totalSteps);return;}}// 改变方向direction = (direction + 1) % 4;stepChangeCount++;// 每两次方向变换后,步长 +1if (stepChangeCount == 2) {stepLength++;stepChangeCount = 0;}}}
}
总结:在解这道题时我开始认为知道螺旋的方向和螺旋的步长规律就可以很好地解答该题了,但是出乎我意料的是在提交了多次代码之后所对的用例只有50%,看到有很多用例上面是运行超时,于是我使用ai修改还是会报50%用例不通过。(这里作为个人的思路,如果有人能使用这种方法进行解答且用例全过的话,可以发在评论区供大家参考,谢谢~)。 因此,我去题解区看了大佬的解题思路后有点小受震撼,用层级的坐标所在的最大的那个层数,(n×2)×(n×2)是求出每层(螺旋层)的右上角的数(原来这样也可以解答!!!),大家也可以琢磨一下大佬的解题思路和代码,领会这种方法解答该题的妙处。