2015-10-07 16 views
3

我想通過採取以下條件生成的Javascript/jQuery的的數獨謎題

  1. 特定數量不應跨越同一列重複的照顧,以填補該數組中的9×9格隨機排列。
  2. 一個特定的數字不應該在同一行重複。

當我執行下面提到的代碼時,它將填充所有帶有隨機值的9 X 9網格,但沒有上述條件。如何在將值插入我的9 X 9網格之前添加這兩個條件。

var sudoku_array = ['1','2','3','4','6','5','7','8','9']; 

$('.smallbox input').each(function(index) { 
    $(this).val(sudoku_array[Math.floor(Math.random()*sudoku_array.length)]); 

}); 

My JSFIDDLE LINK

+0

你可以請添加html和Js到jsfiddle – Mitul

+0

我會說,也許你需要首先建立一個數組數組或可能'null'它應該爲null,然後在頁面中創建元素會更容易。 – Filype

+0

@Filype _「你到目前爲止嘗試過什麼?」_請參閱OP – guest271314

回答

0

你需要跟蹤的你已經插入了什麼之前,以下行:

$(this).val(sudoku_array[Math.floor(Math.random()*sudoku_array.length)]); 

例如,你可以有一個鋸齒形陣列陣列(陣列,其像一個二維數組),而不是你創建的'sudoku_array'來跟蹤可用的數字。實際上,您可以創建兩個鋸齒狀數組,一列用於行,一列用於行。由於您沒有跟蹤之前插入的內容,因此數字是隨機生成的。

在創建,保持現有的數字數組,你執行以下操作:

  • 後生成數,從交錯數組各自的行和列刪除它來標記它不能用於這些行和列。
  • 在創建任何數字之前,請檢查它是否在鋸齒陣列中可用(檢查列和行)。如果不可用,請嘗試使用另一個號碼。

注意:您可以減少您生成的隨機數限制爲可用數字。如果你這樣做了,那麼你生成的隨機數x就意味着該單元格的可用數字是x。這樣你就不會得到一個不可用的數字,因此它工作得更快。

編輯:正如Lex82在評論和答案中指出的那樣,您還需要回溯以避免死衚衕或者您需要深入數學。我只是想保留我的答案,以防止它給你一個想法。

+0

不幸的是,這通常不起作用。你可以很容易地結束在一個死衚衕裏,下一個領域不可能有更多的數字。你將需要某種回溯。另請參閱我的答案。 – lex82

+0

@ lex82是需要支持跟蹤才能生成理想的解決方案。 – HarshMakadia

2

生成和解決Sudokus其實並不像其他(錯誤的)答案那樣簡單,但它也不是火箭科學。而不是從維基百科複製和粘貼,我想指向this question

但是,由於指向外部鏈接是不好的做法,我想通過至少提供直覺來證明它爲什麼天真的方法失敗。

如果您通過用隨機數填充某些字段(因此考慮到您的約束條件)而開始生成Sudoku棋盤,您將獲得部分填充棋盤。完成它相當於解決一個數獨,這是通過堅持數獨規則完成一個部分填充的董事會。如果你嘗試過,你會知道這是不可能的,如果你通過選擇一個有效的數字來決定下一個數字,那麼只能選擇3x3的方框,列和行。除了最簡單的Sudokus之外,所有的都有一些試驗和錯誤,所以你需要一種回溯的形式。

我希望這會有所幫助。

+0

你給的這兩個鏈接都指向同一頁面。 –

+0

謝謝,我刪除了第二個。我想在撰寫本文的時候,我有另外一個,但混合起來,並無意中發佈了相同的鏈接兩次。 – lex82

2

爲確保在一行上沒有重複的號碼,您可能需要一個混洗功能。對於列,你只需要很難做到這一點(查看以前的解決方案以查看該列是否存在數字)。我希望我不會混淆列的列,我傾向於做很多。

它類似於演化計算中的八皇后問題。回溯,純粹的隨機遊走或演變的解決方案可以解決這個問題。

此代碼需要一段時間,但它會完成這項工作。

Array.prototype.shuffle = function() { 
    var arr = this.valueOf(); 
    var ret = []; 
    while (ret.length < arr.length) { 
     var x = arr[Math.floor(Number(Math.random() * arr.length))]; 
     if (!(ret.indexOf(x) >= 0)) ret.push(x); 
    } 
    return ret; 
} 

function getSudoku() { 
    var sudoku = []; 
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; 
    sudoku.push(arr); 
    for (var i = 1; i < 9; i++) { 

     while (sudoku.length <= i) { 
     var newarr = arr.shuffle(); 
     var b = false; 
     for (var j = 0; j < arr.length; j++) { 
      for (var k = 0; k < i; k++) { 
       if (sudoku[k].indexOf(newarr[j]) == j) b = true; 
      } 

     } 
     if (!b) { 
      sudoku.push(newarr); 
      document.body.innerHTML += newarr; 
     } 
    } 
    } 
    return sudoku; 
} 

您現在可以通過返回的二維數組迭代,並填補了數獨箱。霍拉,如果你需要任何幫助