Как исключить элемент массива в массиве 3 измерения java

У меня возникла проблема с удалением кандидатов в ячейке судоку, я пытался найти кандидатов для заполнения пустых ячеек, как показано ниже.

for (int y = 0; y < 9; y++) {
        for (int x = 0; x < 9; x++)
            if(game.getNumber(x, y) == 0){
                for(int z = 1; z <=9; z++){
                    if (CekRow(game, y, z) && CekColumn(game, x, z) && CekRegion(game, x, y, z)){
                        list[y][x][z-1] = z;
                    }
                }
            }
    }

затем, найдя пустую ячейку и заполнив ее кандидатом, я хочу исключить возможный массив элементов, например этот метод enter описание изображения здесь. у меня есть кто-то, кто может предоставить решение для устранения массива list[y][x][z].


person Victor Chandra    schedule 02.03.2017    source источник
comment
Под устранением вы имеете в виду сделать размер массива короче?   -  person Ignacio Alorre    schedule 02.03.2017
comment
что такое CekRow(game, y, z) ...и т.д.? и что значит устранить?   -  person Naman    schedule 02.03.2017
comment
CekRow возможно проверяет, присутствует ли значение z (или возможно) в строке y.   -  person David Choweller    schedule 02.03.2017
comment
Я думаю, что может быть более продуктивно начать с уже установленных значений и исключить возможности из затрагиваемой строки, столбца и области, чем начинать с неустановленных значений и пытаться их заполнить.   -  person David Choweller    schedule 02.03.2017
comment
я имею в виду, что строка 1 может быть такой 0 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0 | 0 0 0 0 5 6 0 0 9 | 0 0 3 4 5 0 0 0 9 | 0 0 0 0 0 0 0 0 0 | 0 0 0 4 0 6 0 0 9 | 0 0 0 0 5 0 0 0 9 | 0 0 0 0 0 0 0 0 0 | 0 0 0 0 5 0 0 0 9 причина в ячейке в столбцах 7 и 9 есть возможные элементы (5 и 9), я хочу удалить элементы (5 и 9) в массиве возможные другие и т. д. (5,6,9) -> ( 0,6,0)   -  person Victor Chandra    schedule 02.03.2017
comment
Ваша запись немного сбивает с толку. Похоже, что 000050009 означает, что возможны только 5 и 9, но, согласуясь с этой нотацией, такие значения, как 000000000, не имеют смысла, поскольку они означают, что в этом месте невозможно никакое значение.   -  person David Choweller    schedule 02.03.2017
comment
Я бы посоветовал вам использовать класс BitSet, чтобы отслеживать возможности для каждого квадрата.   -  person David Choweller    schedule 02.03.2017
comment
извините, что ввел вас в заблуждение, если это возможно 000000000 в ячейке, это означает, что ячейка уже заполнена номером, так что ячейка невозможна. моя идея заключается в том, что если ячейка в строке 1 столбца 7 и ячейка в строке 1 столбца 9 имеют одинаковые возможные значения 000050009. мы знаем, что мы не можем поместить 5 и 9 в ячейку в той же строке, тогда я хочу исключить 5 и 9 из возможных кандидат строки 1 столбец 3 (000056009) -> до (000006000) @DavidChoweller. спасибо за совет   -  person Victor Chandra    schedule 02.03.2017
comment
Если бы вы представляли каждую ячейку в виде набора битов, вы могли бы сделать это довольно легко. Предположим, вы хотите исключить 5 и 9 на всех клетках в определенном ряду. Затем просто используйте цикл for, чтобы пройти через каждый набор битов в этой строке и вызвать bitSet.clear(5) и bitSet.clear(9). bitSet.get(5) возвращает логическое значение, которое сообщает, установлено ли 5-е значение или нет.   -  person David Choweller    schedule 02.03.2017
comment
Другой вариант — применить маску к элементам, которые вы хотите удалить из массива, с помощью двойного цикла for. Я снова отредактировал свой ответ с этой новой концепцией.   -  person Ignacio Alorre    schedule 02.03.2017
comment
хорошо, спасибо за ваш совет. я узнаю, как работает класс BitSet в java.   -  person Victor Chandra    schedule 02.03.2017
comment
@VictorChandra Я добавил ответ, который может дать вам представление о том, как набор битов может упростить вашу проблему.   -  person David Choweller    schedule 02.03.2017


Ответы (1)


Вот еще одна возможная структура данных для доски судоку с использованием класса Java BitSet. Каждая ячейка на доске имеет свои возможности, отслеживаемые переменной BitSet с именем possibilities.

Также показан пример метода eliminateInRow, который исключает числа как возможные из строки. Метод включает в себя список столбцов, которые нужно пропустить в строке, чтобы исключить ячейки, которые изначально заставили нас выполнить исключение (например, ячейки 7 и 9, упомянутые ОП в комментариях к исходному вопросу). Также есть еще один случай, когда вы найдете 3 ячейки, содержащие возможности (3,5,9) (например), тогда вы можете исключить 3,5,9 как возможности из всех других ячеек в строке (исключая исходные 3 ячейки). ). Этот метод будет иметь дело как со случаем 2, так и со случаем 3, поскольку он использует List целых чисел, обозначающих столбцы для пропуска.

import java.util.BitSet;
import java.util.List;

class SudokuCell {
    BitSet possibilities;
    CellValue value;

    SudokuCell() {

        // Initially the value of this cell is undefined
        value = CellValue.Undefined;

        possibilities = new BitSet(9);
        // Initially every value is possible
        possibilities.set(0, 9);
    }

    // clears the possibility of 'number' from this cell
    void clear(int number) {
        possibilities.clear(number - 1);
        // If there is only one possibility left
        if (possibilities.cardinality() == 1) {

            // Set value of the cell to that possibility
            int intValue = possibilities.nextSetBit(0);
            value = CellValue.fromInteger(intValue);
        }
    }

    // returns the value of this square if it is defined
    int getValue() throws Exception {
        if (value == CellValue.Undefined) {
            throw new Exception("Undefined cell value");
        }
        return CellValue.toInteger(value);
    }

    // returns whether 'num' is still possible in this cell
    boolean isPossible(int num) {
        return possibilities.get(num-1);
    }
}

public class SudokuBoard {
    SudokuCell[][] sudokuBoard;

    // constructor
    SudokuBoard() {
        sudokuBoard = new SudokuCell[9][9];
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                sudokuBoard[row][col] = new SudokuCell();
            }
        }

    }

    // eliminate the possibility of 'num' from row 'row'
    // skipping columns in List skipCols
    void eliminateInRow(int row, int num, List<Integer> skipCols) {
        for (int col = 0; col < 9; col++) {
            if (!skipCols.contains(col)) {
                sudokuBoard[row][col].clear(num);
            }
        }

    }

}

Ниже приведен код для enum CellValue, который является необязательным:

enum CellValue {
    Undefined, One, Two, Three, Four, Five, Six, Seven, Eight, Nine;
    public static CellValue fromInteger(int x) {
        switch (x) {
        case 0:
            return Undefined;
        case 1:
            return One;
        case 2:
            return Two;
        case 3:
            return Three;
        case 4:
            return Four;
        case 5:
            return Five;
        case 6:
            return Six;
        case 7:
            return Seven;
        case 8:
            return Eight;
        case 9:
            return Nine;
        }
        return null;
    }

    public static int toInteger(CellValue value) throws Exception {
        switch (value) {
        case Undefined:
            throw new Exception("Undefined cell value");
        case One:
            return 1;
        case Two:
            return 2;
        case Three:
            return 3;
        case Four:
            return 4;
        case Five:
            return 5;
        case Six:
            return 6;
        case Seven:
            return 7;
        case Eight:
            return 8;
        case Nine:
            return 9;
        }
        throw new Exception("Undefined Cell Value");
    }
}
person David Choweller    schedule 02.03.2017