數獨,俗稱九宮格,由乙個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...