構造數獨和解數獨

2021-06-13 02:19:20 字數 2484 閱讀 2634

數獨,俗稱九宮格,由乙個9×9的網格組成,整個網格又分成9個3×3的小正方形網格,每個格仔有乙個數字(1~9),數獨滿足如下要求:

(1)每個數字在每一行只出現一次

(2)每個數字在每一列只出現一次

(3)每個數字在每個3×3的小區域中也只出現一次

如下圖所示,為我們比較常見的數獨形式,為乙個缺了數字的數獨,現在要求我們把其補充為乙個完整的數獨。

其實,構造數獨和解數獨的步驟差不多,都可以用回溯法,下面先來講下如何解乙個殘缺的數獨。

解數獨

我們可以用乙個9*9的二維陣列來表示數獨,陣列中沒有數字的位置用0來代替,對於這樣乙個問題,我們可以列舉每個值為0的位置的取值(0~9),採用深搜,如果沒有滿足條件的情況,則回溯到前面的一步,直到所有位置都填滿了數字位置。

**如下

#include #include #include const int n = 9;

int sudo[n][n];

void inputsudoku();

void outputsudoku();

bool dfs(int curcnt);

bool issatisfy(int pos, int num);

int main(void)

void inputsudoku()

void outputsudoku()

}

//下面的return語句如果加上的話就變成了得到一種解就退出,不加的話為列印所有的可能解。

bool dfs(int curcnt)

if (sudo[curcnt/9][curcnt%9])

else

}//return false; }

}bool issatisfy(int pos, int num)

} return true;}*

3 4 0 0 0 2 0 1 7

0 0 2 9 0 1 4 0 5

7 0 9 0 0 5 0 0 0

0 0 7 6 2 3 1 5 4

0 3 1 0 8 0 2 7 0

2 5 4 1 9 7 3 0 0

0 0 0 2 0 0 5 0 3

1 0 3 7 0 6 8 0 0

5 2 0 3 0 0 0 6 1

7 3 0 2 1 8 5 0 4

2 1 0 0 0 9 0 0 3

5 9 0 0 7 0 2 8 1

3 4 1 8 6 0 9 2 7

0 6 0 0 9 0 0 1 0

9 5 2 0 4 1 8 3 6

4 7 3 0 8 0 0 5 2

6 0 0 1 0 0 0 4 9

1 0 9 5 3 4 0 6 8

0 0 0 0 0 0 8 0 3

7 6 4 0 5 3 9 0 0

0 5 3 9 2 0 7 6 4

5 0 0 2 3 9 0 0 7

0 0 9 0 1 0 6 0 0

4 0 0 6 8 5 0 0 2

6 9 5 0 7 2 1 4 0

0 0 2 1 9 0 5 7 6

1 0 8 0 0 0 0 0 0

*/

構造數獨我們現在已經知道了如何解乙個數獨,那如何構造乙個數獨呢?

其實構造乙個數獨也是解乙個數獨,只不過此時的數獨沒有乙個位置上的數字是已知的,採用同的方法,每次我們挑選乙個數字時,我們用隨機的方法選擇數字,這樣就能得到隨機的數獨。得到數獨以後,我們將某些位置的數字去掉,去掉的數字越多,數獨的難度就越大。

貼下**:

隨機去掉幾個數字就成乙個待解決的數獨啦

構造解數獨

public class sudoku 尋找橫座標下一位置 int findx int x,int y 尋找縱座標下一位置 int findy int x,int y 輸出完成的數獨矩陣 void sdprint system.out.print n system.out.print n 判斷當前位...

數獨問題 解數獨

數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1 9中的某個數字。要求是 每行 每列 每個小宮格中數字不能重複。現要求用計算機求解數獨。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。輸出描述 輸出九行,每行九個...

leetcode 數獨是否合法與解數獨

看到解數獨就想到了n皇后問題,關鍵點是如何將題目中的合法條件轉換為 題目 36.有效的數獨鏈結 思路 首先我先考慮的是如何,如何滿足題目中的三個條件。剛開始想到用unordered map後來發現其實可以用陣列來存 數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9...