2013-03-21 22 views
7

我的數獨求解方法有問題。該程序是這樣工作的;開始時該板是空的,用戶在板上添加了一些數字,然後點擊Solve按鈕,程序試圖解決它。除了如果我把相同的數字放在同一行,一切都可以正常工作。因此,如果用戶添加1,1,0,0 ... 0.在這個難題中,它不能解決它,因爲它的兩個1彼此相鄰,並且將永遠持續下去,試圖找到一個令人振奮的東西,即使它不可解難題。但是,如果它們都是0(空),它會立即解決它,就像Id將1和2放在左上角一樣。如果我只是把一些隨機數字,它會發現它作爲無法解決(或將解決它,如果它是一個有效的謎題)數獨求解方法

我在想說,當theNumber == (row, col) equals thenNumber == (row+1, col),它應該return false,因爲它是一個重複號碼。

這是我試圖在解決方法中添加的代碼,顯然沒有成功。

if ((puzzle.getNum(row, col) == a) == (puzzle.getNum(row + 1, col) == a)) { 
    return false; 
} 

幫助感激

+3

您嘗試在嘗試「解決」之前嘗試添加某種驗證嗎?如果你馬上知道這個難題是無法解決的(連續兩個1),那麼你不想試圖解決無限循環。 – Walls 2013-03-21 16:18:23

+0

@牆是的我試着做某種驗證方法,但我無法讓它工作。這是我「驗證」的新嘗試。這就是我需要幫助的。 – Rob 2013-03-21 16:19:34

+1

從a,i,j改變變量名將使這個更具可讀性。或者有些意見將不勝感激。我嘗試使用有意義的變量名稱,並使故障排除變得更簡單。 – 2013-03-21 16:21:15

回答

4

驗證這樣的難題:

  1. 創建9種元素的一個布爾值數組。
  2. 循環遍歷每行,每列和9x9框。
    • 如果讀取數字,請將數組中的對應值設置爲true。
    • 如果它已經是真的拋出一個錯誤(不可能的難題)。
    • 讀取行,列或9x9框後,重置布爾數組。
  3. 然後,如果驗證成功,則調用求解方法。

編輯:源碼

public boolean checkPuzzle() { 
    boolean[] nums = new boolean[9]; 
    for (int row = 0; row < panel.puzzleSize; row++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[row][cell]]) return false; 
      nums[puzzle[row][cell]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int col = 0; col < panel.puzzleSize; col++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[cell][col]]) return false; 
      nums[puzzle[cell][col]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int square = 0; square < panel.puzzleSize; square++) { 
     int squareCol = panel.squareSize * (square % panel.squareSize); 
     int squareRow = panel.squareSize * Math.floor(square/panel.squareSize); 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      int col = cell % panel.squareSize; 
      int row = Math.floor(cell/panel.squareSize); 
      if (nums[puzzle[squareCol + col][squareRow + row]]) return false; 
      nums[puzzle[squareCol + col][squareRow + row]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    return true; 
} 

沒有太多的時間來測試,但它可能工作(?)。行/列變量namings可能不正確,因爲我沒有時間在您的代碼中找到它,但它的工作與否無關緊要。

+0

該代碼在我的方法中看起來如何?由於我實際上很難實施某種驗證方法。我知道我需要遍歷我的行,列,但我不確定如何執行第2步。 – Rob 2013-03-21 16:28:20

+0

你必須在調用求解方法之前(重複調用check()的方法),我建議你用三個循環遍歷行,cols和9x9塊,然後在裏面實現更新布爾數組的代碼和檢查相同的數字我不能提供代碼,因爲我不知道除了check()方法外,你的解決方案看起來如何,你應該像'if(boolean_array [found_number]){/ * fail * /} boolean_array [found_number] = true;'。 – Pietu1998 2013-03-21 16:32:54

+0

我會繼續嘗試你的建議,同時我編輯我的主帖並添加了我的源代碼 – Rob 2013-03-21 16:44:46