2016-10-01 2 views
0

私は、可能なすべての値を四角で試して、それが解決策につながっていない場合は逆戻りします。私はほとんど動作しているアルゴリズムを持っていると信じていますが、これまでは16セルのパズルの行0、2、3でしか動作しませんでした。数独アルゴリズムが正しく逆戻りしない

現在、3番目の数独ルールはチェックされず、列と行のみがチェックされます。しかし、それでも行と列のルールに従うパズルを返す必要があります。そして、checkBoxメソッドが記述されると、パズルを解くことができます。私はどこでここでうんざりしたのですか?いくつかの例と

EDIT:

 {1, 2, 0, 0}, 
     {0, 4, 0, 0}, 
     {0, 0, 1, 0}, 
     {0, 0, 3, 2} 

を入力するためのプログラムは

 {1, 0}, 
     {2, 0} 
の入力について

1 2 4 3 4 4 4 4 2 3 1 4 4 1 3 2

を返します0

正しく解決します。それは未解決のパズルを返す

 { 1, 0, 3, 4, 0, 0 }, 
     { 4, 0, 6, 0, 0, 3 }, 
     { 2, 0, 1, 0, 6, 0 }, 
     { 5, 0, 4, 2, 0, 0 }, 
     { 3, 0, 2, 0, 4, 0 }, 
     { 6, 0, 5, 0, 0, 2 } 

の入力のために

EDIT:問題は、それがスペースをリセットしていなかったということでした

public boolean checkRow(int[]row){ 
    HashSet<Integer> set = new HashSet<Integer>(); 
    for(int i = 0; i < row.length;i++){ 
     if(!set.add(row[i]) && row[i]>0){//Duplicate? 
      return false; 
        } 
       } 
    return true; 
} 
+0

具体的には機能しない例を示してください。 –

+0

@ScottHunter私はいくつかの例を追加しました – realmature

+0

'checkRow'と' checkColumn'は、現在の行/列に '0'が含まれていないことを確認していますか?あなたの再帰の縮退事例は、あまり定義されていないように思われます。これは、最後のインスタンスで未解決のパズルを返すアルゴリズムを説明します。私はあなたの 'return true'が' return solved'である必要があると思っています。あなたのベースケースのために 'solve 'の値を更新する必要があります。 – nbrooks

答えて

1

を求めている人のためcheckRow値が正しくない場合は0に設定します。したがって、最大インデックスに達していて正しくない場合は、そのまま残します。以下のコードは動作します。私のグループの他の人がボックスチェック方法を提供するのを待っていますが、私はおそらくそれを自分でやる必要があります。

public boolean fillBoard(int[][] board, int row, int col){ 
    int index = 1;    //Next value to try when an empty is found 
    boolean solved = false; 

    for(int i = row; i < width; i++){  //For each row 
     for(int j = col; j < height; j++){ //For each column 
      if(board[i][j]==0){    //0 represents empty 
       while(!solved){    //While the puzzle is unsolved 
        board[i][j] = index; //Try to fill with index 
        if(checker.checkRow(board[i]) 
          && checker.checkColumn(columnToArray(board, j)) 
          //&& checker.checkBox(<input>) 
          ){ 
          solved = fillBoard(board, i, 0); //Next space 
        } 
        if(!solved) board[i][j] = 0; 
        if(index < width){ 
         index++; 
        }else{ 
         return false; 
        }       
       } 
      } 
     } 
    } 
    puzzle = copyPuzzle(board); 
    return true; 
} 
関連する問題