我制定了一个程序来检查一个国王可以用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);
}
}
}
我不是百分百肯定,但你确实知道你从技术上开始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);
}
}
}
祝好运!
您检查新方格有效性的公式是不正确的;它不应该涉及平方。正如你所发现的,对于K = 3
,你的病情就变成了
(r' - r)² + (c' - c)² ≤ 2 × 3² = 18
实际上,通过制作r' = r + 4
和c' = 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)
。这是直观的,因为有效区域应该是跨越行rmin
到rmax
和列cmin
到cmax
的矩形。