Сравнение целых чисел строк и столбцов двумерного массива. Sudoku - PullRequest
1 голос
/ 16 февраля 2012

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

public static rowCheck(int[][] nsudokuBoard) {

    for (int i =0; i < 9; i++) {

        for (int j = 0; j < 9; j++) { 
            // (nsudokuBoard)
        }
    }
}

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

Ответы [ 3 ]

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

Вы можете сравнить все значения массива 2d, как показано в коде ниже:

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

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

        do {
            if (j < width) {
                int current = nsudokuBoard[i][j];

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

                if (current == reference) {
                // invalid entry found do something
                }
            }
            ++j;
        } while ((j >= width) || (j >= depth));
    }
}

Я не пытался скомпилировать этот код, но он должен дать вам представление о том, как выполнитьтвое задание.Я бы предложил вместо того, чтобы передавать int[][] sudokuBoard, что вы должны определить класс, который инкапсулирует концепцию SudokuSquare и передать SudokuSquare[][], таким образом ваш метод validate может вернуть List<SudokuSquare>, содержащий все ошибочныезаписи.

0 голосов
/ 31 мая 2015

сделать класс Cell с полями row, col, block, value; затем создайте матрицу класса с полями cell = cell [], заполните матрицу. сделайте проверку класса с помощью основного метода Matrix matrix = init (int [] []) и check (matrix), где init (·) заполняет матрицу. логическое ok = check (матрица), где check (Matrix) делает, если (! rowcheck ()) возвращает false; if (! colcheck ()) возвращает false и т. д .;

создайте несколько методов, таких как getrows (), getrow (r) и для (Cell cell: matrix.values ​​()), чтобы отфильтровать те, которые вы хотите.

немного утомительно, но я сделал это, и оно твердое, как камень.

Как примечание, фильтрация по матрице может показаться глупой, но компьютеры работают быстро, и проблема в O (1), так как это 9x9.

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

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

boolean isRowValid(int[][] grid, int row) {
  boolean[] seen = new boolean[9];
  int row; // chosen somewhere else
  for (int col = 0; col < 9; col++) {
    if (seen[grid[row][col] - 1]) { // if we've seen this value before in this row
      return false; // there is a duplicate, and this is a bad sudoku
    }
    seen[grid[row][col] - 1] = true; // mark us as having seen this element
  }
  return true; // we're all good
}
return true; // this row is fine
...