代码仅适用于2个步骤,输出在2个步骤后开始偏离

问题描述 投票:1回答:2

我制定了一个程序来检查一个国王可以用K步移动的位置数。我有一个8×8的棋盘,行和列标记为1到8.假设我们的国王在位置1,3;他可以移动到5个新的位置并且可以保持到当前的位置,所以总的来说我们的国王可以移动到6个位置。我们的国王可以移动的新地方的有效性可以通过公式Square(r'-r)+Square(c'-c)<=2检查,其中r'c'是要检查的细胞的位置。

我的代码适用于K = 1和2,但结果开始偏离3个或更多K值。

import java.util.Scanner;

class Chess {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int testCases;
        testCases = input.nextInt();
        while (testCases-- > 0 && testCases <= 512) {
            int R, C, K, count = 0;
            R = input.nextInt();
            C = input.nextInt();
            K = input.nextInt();
            if (R >= 1 && R <= 8 && C <= 8 && C >= 1 && K <= 8 && K >= 1) {
                for (double rowIndex = 1; rowIndex <= 8; rowIndex++) {
                    for (double columnIndex = 1; columnIndex <= 8; columnIndex++) {
                        if (Math.pow((rowIndex - R), 2) + Math.pow((columnIndex - C), 2) <= (2 * Math.pow(K, 2))) {
                            count++;
                        }
                    }
                }
            }
            System.out.println(count);
        }
    }
}
java chess
2个回答
0
投票

我不是百分百肯定,但你确实知道你从技术上开始R,C和K为1,而计数仍为0,对吗?这是因为在使用它们之前,您将移动到下一个int。

我会将代码调整为如下,看看是否会产生更好的结果!

import java.util.Scanner;

class Chess {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int testCases;
        testCases = input.nextInt();
        while (testCases-- > 0 && testCases <= 512) {
            int R, C, K, count = 0;
            if (R >= 1 && R <= 8 && C <= 8 && C >= 1 && K <= 8 && K >= 1) {
                for (double rowIndex = 1; rowIndex <= 8; rowIndex++) {
                    for (double columnIndex = 1; columnIndex <= 8; columnIndex++) {
                        if (Math.pow((rowIndex - R), 2) + Math.pow((columnIndex - C), 2) <= (2 * Math.pow(K, 2))) {
                            count++;
                        }
                    }
                }
            R = input.nextInt();
            C = input.nextInt();
            K = input.nextInt();
            }
            System.out.println(count);
        }
    }
}

祝好运!


0
投票

您检查新方格有效性的公式是不正确的;它不应该涉及平方。正如你所发现的,对于K = 3,你的病情就变成了

(r' - r)² + (c' - c)² ≤ 2 × 3² = 18

实际上,通过制作r' = r + 4c' = c可以满足,因为16≤18。但这意味着国王移动了四个方块!

相反,你可以在每个方向重申你的状况:

  • 国王可以向上移动k,但不超过第8排,所以国王可以达到的最高排是rmax = min(r + k, 8);
  • 同样,rmin = max(r - k, 1);
  • 同样,cmax = min(c + k, 8);
  • 同样,cmin = max(c - k, 1)

然后,您可以简单地将答案计算为(rmax - rmin + 1) × (cmax - cmin + 1)。这是直观的,因为有效区域应该是跨越行rminrmax和列cmincmax的矩形。

© www.soinside.com 2019 - 2024. All rights reserved.