數獨游戲編程
『壹』 查數獨游戲規則
我用EXCEL的宏編過,但是演算法不太好,簡單得可以作出,難得的就不行了 想法如下: 建立一個X(a,b,c,d)的列陣,4個數為(1,2,3)中的一個 a,b表示大的33陣(就是你所說的"區")的位置 c,d表示在特定33陣(特定"區")中的位置 那麼每個特定的X表示特定的空格位置 每個X初始都=123456789 X的值表示這個空格可能取的數 然後已經給出的條件的X改為條件給出的數 現在我雖然不知道剩下的空格是哪個數,但是我可以知道特定的空格中不可以是哪個數(按規則) step1 所以分別檢查每個空格 將不可能出現的數字從123456789中刪去(比如這個區已經存在1,4,5那麼我們把區中其他的空格的1,4,5去掉,變成2,3,6,7,8,9) 這樣X的位數就越來越小了 當X的長度等於1的時候那麼這個空格就是唯一的了 step2 檢查每一個區中的9個數中含有幾個1,如果只有1個,那麼含有1的哪個空格就是1了,(1-9,依次檢驗),(行或者列也要分別檢驗) step3 檢查是不是每個數都小於10,如果不是 檢查經過step1和step2後,各個數字有沒有變化,如果有,那麼重復step1,step2.沒有的話(說明按剛剛的步驟只能解到這樣了)結束循環 我編的只是為了方便幫我解題,太難的做不出,但是用的話可以解出很多數了,人在看一下,很快就解出了 如果一定要編到底的話,我也想過 然後在X中尋找1個2位數,假定2位數中的一個是正確的,然後在按剛剛的步驟,如果結果有矛盾則就是另一個數 希望對你有幫助
『貳』 java高手進,求一個數獨游戲java代碼
數獨(sudoku)的生成與破解
最近在網上比較流行的智力游戲。筆者本人也玩過,可以下個模擬游戲試試,簡單的還可以,太難就無從下手了。雖然偶腦子不好使,但偶是計算機科班出身,怕你不成,老規矩,編程破解。
首先,偶是第一次做數獨的程序,可能程序不強,以後有時間再改進改進。望高手評析。
還是把數獨游戲的規則說一說吧,或許你是剛剛聽說這個名字的朋友。數獨(sudoku),起源於瑞士,於1970 年代由美國的一家數學邏輯游戲雜志首先發表,當時名為Number Place。及後在日本大力推廣下得以發揚光大,於1984 年取名「數獨」,即「獨立的數字」的省略,在一個9x9的方格中,有81個小方格組成,然後又分9個大塊,每塊由3x3的方格組成,就是中國的九宮圖,大九宮裡面再套9個小九宮,共九九八十一個小格子,游戲開始前會有一些格子上寫好了數,你需要在剩下的格子里填數,真到把所有格子填滿,並且要求,任何一行或一列或者一個小九宮中沒有相同的數字,當然你只能用1-9之間的9個數字
以下是java代碼,能幫我轉換成c++的嗎?(轉換成功再追加100分,謝謝了。)
Java code public class Sudoku { /** * Print the specified Sudoku problem and its solution. The * problem is encoded as specified in the class documentation * above. * * @param args The command-line arguments encoding the problem. */ public static void main(String[] args) { int[][] matrix = parseProblem(args); writeMatrix(matrix); if (solve(0,0,matrix)) // solves in place writeMatrix(matrix); else System.out.println("NONE"); } static boolean solve(int i, int j, int[][] cells) { if (i == 9) { i = 0; if (++j == 9) return true; } if (cells[i][j] != 0) // skip filled cells return solve(i+1,j,cells); for (int val = 1; val <= 9; ++val) { if (legal(i,j,val,cells)) { cells[i][j] = val; if (solve(i+1,j,cells)) return true; } } cells[i][j] = 0; // reset on backtrack return false; } static boolean legal(int i, int j, int val, int[][] cells) { for (int k = 0; k < 9; ++k) // row if (val == cells[k][j]) return false; for (int k = 0; k < 9; ++k) // col if (val == cells[i][k]) return false; int boxRowOffset = (i / 3)*3; int boxColOffset = (j / 3)*3; for (int k = 0; k < 3; ++k) // box for (int m = 0; m < 3; ++m) if (val == cells[boxRowOffset+k][boxColOffset+m]) return false; return true; // no violations, so it's legal } static int[][] parseProblem(String[] args) { int[][] problem = new int[9][9]; // default 0 vals for (int n = 0; n < args.length; ++n) { int i = Integer.parseInt(args[n].substring(0,1)); int j = Integer.parseInt(args[n].substring(1,2)); int val = Integer.parseInt(args[n].substring(2,3)); problem[i][j] = val; } return problem; } static void writeMatrix(int[][] solution) { for (int i = 0; i < 9; ++i) { if (i % 3 == 0) System.out.println(" -----------------------"); for (int j = 0; j < 9; ++j) { if (j % 3 == 0) System.out.print("| "); System.out.print(solution[i][j] == 0 ? " " : Integer.toString(solution[i][j])); System.out.print(' '); } System.out.println("|"); } System.out.println(" -----------------------"); } } -----------------------
| 4 3 | 7 | 9 8 |
| 5 | 3 | |
| 1 | | 3 |
-----------------------
| 6 | 2 7 | |
| 4 7 | | 1 3 |
| | 5 4 | 9 |
-----------------------
| 2 | | 3 |
| | 5 | 4 |
| 5 4 | 1 | 2 6 |
-----------------------
-----------------------
| 2 4 3 | 7 1 6 | 9 5 8 |
| 9 8 5 | 2 3 4 | 7 1 6 |
| 7 1 6 | 8 9 5 | 3 4 2 |
-----------------------
| 6 3 9 | 1 2 7 | 5 8 4 |
| 4 5 7 | 9 6 8 | 1 2 3 |
| 8 2 1 | 5 4 3 | 6 7 9 |
-----------------------
| 1 6 2 | 4 7 9 | 8 3 5 |
| 3 7 8 | 6 5 2 | 4 9 1 |
| 5 9 4 | 3 8 1 | 2 6 7 |
-----------------------
『叄』 基於SAT的數獨游戲求解程序,求C語言代碼
用0代表要填的數
#include <stdio.h>
#include <stdlib.h>
#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)
struct{
int left;
char num;
char try;
}board[SIZE][SIZE];
int bit2num(int bit)
{
switch(bit){
case 16:
case 256:
return 9;
基礎解法
排除法(摒除法)
摒除法:用數字去找單元內唯一可填空格,稱為摒除法,數字可填唯一空格稱為排除法 (Hidden Single)。
根據不同的作用范圍,摒余解可分為下述三種:
數字可填唯一空格在「宮」單元稱為宮排除(Hidden Single in Box),也稱宮摒除法。
數字可填唯一空格在「行」單元稱為行排除法(Hidden Single in Row),也稱行摒除法。