Судоку Checker 2d массив Java - PullRequest
       19

Судоку Checker 2d массив Java

0 голосов
/ 16 февраля 2012

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

это то, что у меня есть ... но когда я запускаю его, кажется, что проверяется только первое целое число. (например, первая строка доски судоку гласит: 1 2 2 2 2 2 2 2 2 2), она не обнаружит очевидные кратные 2, но если я изменю вход на 1 1 2 2 2 2 2 2 2, появится ошибка до нескольких единиц в этом случае. несколько предложений по настройке циклов, чтобы они проходили через столбцы?

public static void validate(final int[][] sudokuBoard) {
    int width = sudokuBoard[0].length;
    int depth = sudokuBoard.length;

    for (int i = 0; i < width; i++) {
            int j = i;
            int reference = sudokuBoard[i][j];

            while (true) {
                if ((j >= width) || (j >= depth)) {
                    break;
                } 
                else if (i == j){
                    // do nothing
                }
                else if (j < width) {
                    int current = sudokuBoard[i][j];

                    if (current == reference) {
                        System.out.print("Invalid entry found (width)" + "\n");
                        System.out.print(current + "\n");


                        // invalid entry found do something
                    }
                } else if (j < depth) {
                    // note reversed indexes
                    int current = sudokuBoard[j][i];

                    if (current == reference) {
                        System.out.print("Invalid entry found (depth)" + "\n");
                        System.out.print(current + "\n");

                        // invalid entry found do something
                    }
                }
                j++;
            }

Ответы [ 3 ]

3 голосов
/ 16 февраля 2012

Ваш код сложнее, чем должен быть. Зачем помещать все в одну функцию, если можно разделить несколько функций?

public static void Validate(final int[][] sudokuBoard)
{
    int width = sudokuBoard[0].length;
    int depth = sudokuBoard.length;

    for(int i = 0; i < width; i++)
        if(!IsValidRow(sudokuBoard, i, width))
        {
          //Do something - The row has repetitions
        }
    for(int j = 0; j < height; j++)
        if(!IsValidColumn(sudokuBoard, j, width))
        {
          //Do something - The columns has repetitions
        }
}

static bool IsValidRow(int[][] sudokuBoard, int referenceRow, int width)
{
    //Compare each value in the row to each other
    for(int i = 0; i < width; i++)
    {
        for(int j = i + 1; j < width; j++)
        {
            if(sudokuBoard[referenceRow][i] == sudokuBoard[referenceRow][j])
                return false
        }
    }
    return true;
}

static bool IsValidColumn(int[][] sudokuBoard, int referenceColumn, int height)
{
    //Compare each value in the column to each other
    for(int i = 0; i < height; i++)
    {
        for(int j = i + 1; j < height; j++)
        {
            if(sudokuBoard[i][referenceColumn] == sudokuBoard[j][referenceColumn])
                return false
        }
    }
    return true;
}

Таким образом, ваш код будет намного легче поддерживать / читать. Этот код выше не был проверен, но он должен быть примерно правильным.

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

0 голосов
/ 16 февраля 2012

Я бы разбил функциональность на меньшие логические проверки.Таким образом, вы можете проверять строку за строкой, столбец за столбцом и квадрат за квадратом.Например,

private boolean isValidRow(int[] row) {
    // Code here to check for valid row (ie, check for duplicate numbers)
}

private boolean isValidColumn(int[] column) {
    // Code here to check for valid column
}

private boolean isValidSquare(int[][] square) {
    // Code here to check for valid square
}

Обратите внимание, что для строк и столбцов необходимо передавать только одномерный массив.Квадраты - это двумерный массив, так как вам нужно проверить область 3х3.Вы также можете рассматривать эти методы как static, так как их функциональность не зависит от экземпляра платы Судоку.

Редактировать: предложение по проверке строки / столбца / квадрата состоит в использовании HashSet.Наборы могут иметь только 1 элемент с определенным значением, поэтому вы можете добавлять элементы и искать ошибку.Например:

HashSet<Integer> hs = new HashSet<Integer>();
for(int i = 0; i < 9; i++) {
    if(!hs.add(integerArray[i])) // HashSet.add returns 'false' if the add fails 
                                 // (ie, if the element exists)
        return false;
}
return true;
0 голосов
/ 16 февраля 2012

Учитывая ограничения судоку (строка из n ячеек должна содержать только цифры 1-n), вам не нужен поиск n ^ 2 по порядку (по строке или столбцу), вы можете сделать это по порядку n, сохранив битовый массив, указывающий, какие цифры вы видели. Вот псевдокод для проверки строк, то же самое для столбцов:

for i in 0 to depth-1 // rows
  boolean seen[] = new seen[width];
  for j in 0 to width-1 // columns
    if seen[board[i][j]-1] == true
      duplicate number
    else
      seen[board[i][j]-1] = true
...