Код работает нормально только на 2 шага, а выход начинает отклоняться после 2 шагов - PullRequest
0 голосов
/ 21 февраля 2019

Я создал программу для проверки количества позиций, которые король может переместить за K шагов.У меня есть шахматная доска размером 8 × 8 с рядами и столбцами, отмеченными от 1 до 8. Предположим, наш король находится в позиции 1,3;он может переместиться на 5 новых мест и может остаться на текущей позиции, поэтому в целом наш король может переместиться на 6 мест.Действительность нового места, где может двигаться наш король, можно проверить по формуле <i>Square(r'-r)+Square(c'-c)<=2</i>, где <i>r'</i> и <i>c'</i> - это позиции ячеек, которые нужно проверить.

Мой код отлично работает для 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 ]

0 голосов
/ 22 февраля 2019

Ваша формула для проверки действительности нового квадрата неверна;это не должно включать возведение в квадрат.Как вы обнаружили, для K = 3 ваше состояние становится

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

, которое, на самом деле, можно удовлетворить, сделав r' = r + 4 и c' = c, поскольку 16 ≤ 18. Но это подразумевает королясдвинулся на четыре клетки вверх!

Скорее, вы могли бы переформулировать свое состояние в каждом направлении:

  • Король может продвинуться на k вверх, но не более чем на 8 th ряд, поэтому самый верхний ряд, которого может достичь король, равен 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.

0 голосов
/ 21 февраля 2019

Я не уверен на 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);
        }
    }
}

Удачи!

...