English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

想作一個隨機產生數獨題目的程式,
可是卡在一開始9個9宮格,81格那
我寫出可以隨機產生81個數,符合數獨的條件
可是實際跑實會卡住,後來我縮減陣列,由9*9變為
6*6就可以了。
請問有人會這部份的程式嗎?

2007-02-08 12:58:52 · 2 個解答 · 發問者 1 in 電腦與網際網路 程式設計

抱歉我仔細說一下我的意思好了。
我的想法是,一開始就產生一個完成的數獨
也就是9*9格中的數字都生產出來。
然後再隨機隱藏幾個數字
所以我宣告了一個Ary(9,9),接著開始產生陣列中81個數字
並且判斷該數字在該行或該列或是該部份的9宮格中有沒有重覆出現

2007-02-09 11:33:37 · update #1

唔..第2位回答的網友我先謝謝..不過這個答案並不完整
因為有3個規則
1.列的數字不能重覆
2.行的數字不能重覆
3.每個小9宮格的數字不能重覆

第3個規則不符.造成在同一個9宮格內.有些數字會重覆出現

2007-02-12 11:25:00 · update #2

感謝來自亡靈的信函...雖然有時會出現無窮迴圈的來回遞迴
不過我打算用timer來處理呼叫的情況..希望能改善
再此奉上點數..謝謝^^

2007-02-13 05:55:03 · update #3

2 個解答

這題雖然點數很少,不過小弟實在覺得很有意思...
小弟的解法是使用遞迴...
亂數填表的順序是111111111222.....888999999999
同一數字在填表時即避開同一行列...
當遇"無解"時,回上一層遞迴修正填入的格子....
答案放在Ans()陣列,以Text1()控制項陣列秀出...
(使用遞迴也許效率較不佳,希望有幸能看見其他大大發表更有效率的答案及演算)

原始程式放在
http://cc.fjtc.edu.tw/~q1606209/Form2.rar
請下載來參考...
以下是小弟的程式碼....

Private Sub Command1_Click()
Dim Ans%(80)
If InputNum(Ans, Ans, 0, Int(Rnd * 81)) Then MsgBox "完成!"
End Sub

Private Function InputNum(ByVal Ans, ByVal Temp, ByVal InN%, ByVal RndN%) As Boolean
Dim I%, J%
Dim N% '填入的數字
Dim Sp% '空格總數
Dim Sa%(80), SaRnd% '亂數範圍陣列

N = InN \ 9 + 1 '填入值

Ans(RndN) = N '亂數選取值填入方陣
Temp(RndN) = N

If InN = 80 Then
For I = 0 To 80 '秀答案
Text1(I) = Ans(I)
Next I

InputNum = True '終止遞迴
Exit Function
End If

'已填過的數字,該列及該行標示為99(99表不可再填入)
For I = (RndN \ 9) * 9 To (RndN \ 9) * 9 + 8
If Temp(I) = 0 Then Temp(I) = 99
Next I

For I = RndN Mod 9 To RndN Mod 9 + 72 Step 9
If Temp(I) = 0 Then Temp(I) = 99
Next I

If N <> (InN + 1) \ 9 + 1 Then
Temp = Ans
End If

Do
Sp = 0
For I = 0 To 80 '定義亂數可選範圍
If Temp(I) = 0 Then
Sa(Sp) = I
Sp = Sp + 1
End If
Next I

'當無格可填時(表無解的狀況),跳回上層遞迴
If Sp = 0 Then Exit Do

Randomize
SaRnd = Int(Rnd * Sp)

If InputNum(Ans, Temp, InN + 1, Sa(SaRnd)) Then
InputNum = True
Exit Function
End If

'會產生無解的格子標示為99(99表不可再填入)
Temp(Sa(SaRnd)) = 99
Loop Until Sp = 0
End Function

2007-02-12 22:00:19 補充:
是我小看數獨的題目了...
第三個條件其實也和行列不可重覆一樣...
只需在填入數值後利用一個0~8的迴圈
將該區的小九宮的其他空格標示為99(同一數字不可再填入)即可
更正後的整個程式我放在
http://cc.fjtc.edu.tw/~q1606209/Form3.rar

2007-02-12 22:05:20 補充:
以下為新增的程式碼
'-------------------
'已填過的數字,該小九宮區域標示為99(99表不可再填入)
T1 = ((RndN \ 27) * 3) ((RndN Mod 9) \ 3)
For I = 0 To 8
T2 = (T1 * 3) ((T1 \ 3) * 18) I ((I \ 3) * 6)
If Temp(T2) = 0 Then Temp(T2) = 99
Next I

2007-02-12 22:09:50 補充:
另外,由於限制的條件變多...
所以產生無解的情狀也會隨之增加,回到上層遞迴的機會也變大..
運氣好的話,不用1秒即可產生一組解答,運氣差也可能跑1分鐘以上
為了不讓你以為程式"掛了"...
我將程式修正為可以讓你即時觀看數字的重組、位移

2007-02-12 22:21:16 補充:
XD
加號不見了,請直接到下載網址觀看程式吧....

2007-02-11 21:33:28 · answer #1 · answered by 幽靈 5 · 0 0

你的敘述不清楚
數獨的題目 應該祇給 30 數字左右
你怎麼會給 81 個數?
而且隨機給數所得的題目可能會無解
"實際跑實會卡住" 是什麼意思
也許你把程式 po 上來會比較清楚
如果有問題, 請來函討論. 不然, 我可能會錯失你再補充的疑點.

2007-02-09 05:46:33 · answer #2 · answered by JJ 7 · 0 0

fedest.com, questions and answers