2016-12-23 2 views
0

Я пытаюсь закодировать метод, который проверяет дубликаты на моей плате судоку. В настоящее время мой метод getFrontier() всегда возвращает true, и я пришел узнать, что это потому, что он проверяет только одно значение, а не массив или значения. Я использую метод 3 раза в квадратных проверках(), rowCheck() и columnCheck(). Есть ли способ закодировать метод, чтобы он сохранил предыдущее значение, которое было введено, а затем проверило его против нового значения?Sudoku - Как использовать HashSet или Set?

Мой текущий код:

public class validCheck { 

public boolean isSolved(int[][][] board) 
{ 
    for(int index = 0; index < board.length;index++) 
    { 
     for(int r = 0; r < board[0].length; r++) 
     { 
      for(int c = 0; c < board[0].length;c++) 
      { 
       if(board[index][r][c] == 0) 
        return false; 
      } 
     } 
    } 
    return true; 
} 


public boolean getFrontier(int value) 
{ 
Set<Integer> reserve = new HashSet<>(); 

for(int n = 1; n < 10; n++) 
{ 
    if(value == n && reserve.contains(n)) 
     return false; 

    else if(value == n) reserve.add(n);  
} 
return true; 
} 

public boolean squareCheck(int[][][] board, int index) 
{ 
    for(int r = 0; r < board[0].length; r++) 
    { 
     for(int c = 0; c < board[0].length; c++) 
     { 
      if(!getFrontier(board[index][r][c])) 
      { 
       System.out.println("Square error at ["+index + r + c +"]"); 
       return false; 
      } 
     } 
    } 

    return true; 

} 

public boolean isValid(int[][][] board) 
{  
    if(isSolved(board)) 
    { 
     for(int i = 0; i < board.length; i++) 
     { 
      for(int r = 0; r < board[0].length;r++) 
      { 
       for(int c = 0; c < board[0].length;c++) 
       { 
        if(!rowCheck(board,i,r) || !columnCheck(board,i,c) || !squareCheck(board,i)) 
        { 
         return false; 
        } 
       } 
      } 
     } 
    } 

    return true; 

} 

public boolean columnCheck(int[][][] board, int index, int col) 
{ 
    int target = 0;  

    if(index <=2) 
    { 
     target = index + 6; 
    } 
    else if(index > 2 && index < 6) 
    { 
     target = index +3; 
     index = index - 3; 
    } 
    else if (index > 5) 
    { 
     target = index; 
     index = index - 6; 
    } 

    while(index <= target) 
    { 
     for(int r = 0; r < board[0].length;r++) 
     { 

      if(!getFrontier(board[index][r][col])) 
      { 
       System.out.println("Column error at " + index + r + col); 
       return false;  
      } 

     } 
     index = index + 3; 
    } 
    return true; 


} 


public boolean rowCheck(int[][][] board, int index, int row) 
{ 
    int target = 0; 

    if(index <= 2) 
    { 
     index = 0; 
     target = 2; 
    } 
    else if (index <= 5) 
    { 
     index = 3; 
     target = 5; 
    } 
    else if(index <= 8) 
    { 
     index = 6; 
     target = 8; 
    } 

    while(index <= target) 
    { 
      for(int c = 0; c < board[0].length; c++) 
      { 
        if(!getFrontier(board[index][row][c])) 
        { 
         System.out.println("Row error at "+index+row+c); 
         return false; 
        } 
      } 
      index++; 
     } 

     return true; 

    } 


} 

Использование:

public static void main(String[] args) { 
int[][][] solved = {{{5,3,4},{6,7,2},{1,9,8}}, 
        {{6,7,8},{1,9,5},{3,4,2}}, 
        {{9,1,2},{3,4,8},{5,6,7}}, 
        {{8,5,9},{4,2,6},{7,1,3}}, 
        {{7,6,1},{8,5,3},{9,2,4}}, 
        {{4,2,3},{7,9,1},{8,5,6}}, 
        {{9,6,1},{2,8,7},{3,4,5}}, 
        {{5,3,7},{4,1,9},{2,8,6}}, 
        {{2,8,4},{6,3,5},{1,7,9}}}; 


validCheck checker = new validCheck(); 

     if(checker.isValid(solved)) 
      System.out.println(true); 

     else System.out.println(false); 
} 

Любая помощь будет в значительной степени быть оценена !!!

+0

Каково ожидаемое поведение метода? Чем он отличается от реального поведения? – pvg

+1

Я бы предложил использовать 2D-массив, так как вы должны проверить, что весь столбец и целая строка являются последовательными при проверке действительной доски sudoku –

+0

Что такое 'getFrontier'? «Frontier» для меня означает западное У.С. в 1800-х годах или что-то подобное, поэтому имя метода не полезно, и комментариев нет. Поскольку это метод, в котором вы, похоже, хотите использовать «HashSet», мне нужно знать, что вы хотите, чтобы этот метод выполнял, чтобы помочь. – ajb

ответ

0

Вот что я хотел бы сделать, чтобы найти действительную конфигурацию платы в двумерной доске судоку. Я бы использовал HashSet для строки, а другой для столбца, если мы никогда не сталкиваемся с повторами, а значения содержат 1 для длины массива, мы знаем, что плата действительна.

int [][] board = {{1,2,3}, 
         {2,3,1}, 
         {3,1,2} 
         }; 
    HashSet<Integer> rowDuplicates = new HashSet<>(); 
    HashSet<Integer> colDuplicates = new HashSet<>(); 
    boolean invalidBoard = false; 

    for(int i = 0 ; i < board.length; i++) 
    { 
     for(int j = 0; j < board[i].length; j++) 
     { 
      if(rowDuplicates.contains(board[i][j]) || colDuplicates.contains(board[j][i])) 
      { 
       //this board is not valid 
       invalidBoard = true; 
      } 
      else 
      { 
       rowDuplicates.add(board[i][j]); 
       colDuplicates.add(board[j][i]); 
      } 
     } 

     //now check they contain the correct numbers from 1 to the size of the array 
     if(colDuplicates.size() == rowDuplicates.size()) 
     { 
      for(int index = 0; index < colDuplicates.size(); index++) 
      { 
       if(!(colDuplicates.contains(index + 1) && rowDuplicates.contains(index + 1))) 
       { 
        invalidBoard = true; 
        break; 
       } 
      } 
     } 
     else 
     { 
      invalidBoard = true;  
     } 
     colDuplicates.clear(); 
     rowDuplicates.clear(); 

    } 

    System.out.println("invalid board: " + invalidBoard); 

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

+0

Спасибо, что нашли время набрать все! У меня появилась идея, посмотрев на ваш код, так что спасибо! Мне очень жаль, что я не могу просто использовать 2D-массив, но я должен использовать трехмерный ... – JAVANOOB

+0

Да, я знаю, но надеюсь, это поможет вам понять логику, необходимую для проверки платы Sudoku с помощью HashSets, и вы можете использовать ее, чтобы расширить ее до 3D-массива @JAVANOOB –

 Смежные вопросы

  • Нет связанных вопросов^_^