Код работает нормально только на 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,

Другие вопросы по тегам