Код работает нормально только на 2 шага, а выход начинает отклоняться после 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);
}
}
}
2 ответа
Я не уверен на 100%, но вы знаете, что вы технически начинаете 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
,