2012-02-16 2 views
0

Итак, у меня есть проблема с моим кодом. Предполагается, что нужно перекрестно проверять строки и столбцы для одних и тех же целых чисел.Sudoku Checker 2d array Java

это то, что у меня есть до сих пор .. но когда я запустил его, мне кажется, что проверяет только первое целое число. (например, первая строка платы судоку читает. 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++; 
      } 
+0

Что такое 'i' и' j'? Почему ничего не делать, когда '(i == j)'? –

+0

У меня была проблема, когда он пересекал sudokuBoard [1] [1]/[2] [2]/[3] [3] и т. Д. Вниз по доске. –

+0

Не понимаю. Почему вы хотите пропустить '[0] [0]', '[1] [1]' и так далее? –

ответ

3

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

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

Я видел, что вы опубликовали несколько вопросов по этой теме, поэтому я решил ответить всем им здесь. Если вы хорошо понимаете, вы должны быть в состоянии выполнить проверку площади самостоятельно! – Msonic

+1

Спасибо за все понимание и чувство направления. Разделение на отдельные булевы помогает мне лучше понять это. :) –

+0

Если вы считаете, что ваш вопрос правильно ответил, вы можете принять ответ, нажав зеленую галочку рядом с ним. :) – Msonic

0

Учитывая ограничения судоку (строка из 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 
0

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

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 
} 

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

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

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;