Определить, если два квадрата на шахматной доске одного цвета - Codefights - PullRequest
0 голосов
/ 26 апреля 2018

Я изо всех сил пытался выяснить, почему мой код не возвращает правильные результаты в аркадном задании CodeFights chessBoardCellColor.

Учитывая две ячейки на стандартной шахматной доске, определите, имеют ли они одинаковый цвет или нет.

Входные данные представлены в виде двухзначных строк, состоящих из одной заглавной буквы A-H, за которой следует одна цифра 1-8.

    boolean chessBoardCellColor(String cell1, String cell2) {    
        return isWhite(cell1)==isWhite(cell2);
    }

    boolean isWhite(String digits){
        boolean state1=false; 
        boolean state2=false;
        boolean white = false;
        char[] digs = digits.toCharArray();
            switch(digs[0]){
                case 'A': state1=true;
                case 'C': state1=true;
                case 'E': state1=true;
                case 'G': state1=true;
                default : state1=false;}
            switch(digs[1]){
                case '1': state2=true;
                case '3': state2=true;
                case '5': state2=true;
                case '7': state2=true;
                default : state2=false;}
        if(state1==state2){white=false;}
        else{white=true;}
        return white;
        }

Я обдумывал это несколько часов, и я не могу понять, где я ошибся. Простите, если это совершенно очевидная проблема, которую мне не хватает.

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

... определить, имеют ли они одинаковый цвет или нет.

boolean chessBoardCellColor(String cell1, String cell2)

Вам не нужно знать цвета, вам нужно знать, являются ли они одинаковыми :

boolean isSameColor(String square0, String square1) {
    return
    (Character.codePointAt(square0, 0) + Character.codePointAt(square0, 1)) % 2 ==
    (Character.codePointAt(square1, 0) + Character.codePointAt(square1, 1)) % 2;
}
0 голосов
/ 26 апреля 2018

Я думаю, что логика сложнее, чем нужно. Я бы проверил сначала столбец, а затем строку. Примерно так:

public final class Chess {
    public boolean isBlack(String field) {
        char[] digs = field.toCharArray();
        return (isOddColumn(digs[0]) && isOddRow(digs[1])) || (isEvenColumn(digs[0]) && isEvenRow(digs[1]));
    }

    public boolean isWhite(String field) {
        return !isBlack(field);
    }

    private boolean isOddColumn(char col) {
        return col == 'A' || col == 'C' || col == 'E' || col == 'G';
    }

    private boolean isEvenColumn(char col) {
        return col == 'B' || col == 'D' || col == 'F' || col == 'H';
    }

    private boolean isOddRow(char row) {
        return row == '1' || row == '3' || row == '5' || row == '7';
    }

    private boolean isEvenRow(char row) {
        return row == '2' || row == '4' || row == '6' || row == '8';
    }

    public static void main(String[] args) {
        Chess app = new Chess();
        System.out.println(app.isBlack("A1"));
        System.out.println(app.isBlack("B2"));
        System.out.println(app.isBlack("C3"));
    }
}
0 голосов
/ 26 апреля 2018

Вы можете сделать это более четко:

private static final String ROW = "12345678";
private static final String COL = "ABCDEFGH";

boolean myIsWhite(String loc) {
    // A row's leftmost square is white every other row starting at 1.
    boolean rowStartsWhite = (ROW.indexOf(loc.charAt(1)) % 2) == 0;
    // They then alternate
    boolean cellIsWhiteIfRowStartsWhite = (COL.indexOf(loc.charAt(0)) % 2) == 0;
    return rowStartsWhite ? cellIsWhiteIfRowStartsWhite : !cellIsWhiteIfRowStartsWhite;
}

public void test(String[] args) {
    for(int r = 0; r < ROW.length(); r++) {
        for(int c = 0; c < COL.length(); c++) {
            String loc = ""+COL.charAt(c)+ROW.charAt(r);
            boolean isWhite = myIsWhite(loc);
            System.out.println("Loc = "+loc+" is "+(isWhite?"White":"Black"));
            if(isWhite != isWhite(loc)) {
                System.out.println("You were wrong with this one.");
            }
        }
    }
}
0 голосов
/ 26 апреля 2018

Вы должны добавить break после каждого case xx, например:

case '1': state2=true; return;

в противном случае программа продолжит работу до последнего default, а state1 & state2 всегда будет false.

...