數獨問題 解數獨

2021-10-04 09:18:10 字數 2998 閱讀 1169

數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1-9中的某個數字。要求是:每行、每列、每個小宮格中數字不能重複。 現要求用計算機求解數獨。

輸入描述:

輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。

輸出描述:

輸出九行,每行九個空格隔開的數字,為解出的答案。

示例1

輸入

0 9 0 0 0 0 0 6 0

8 0 1 0 0 0 5 0 9

0 5 0 3 0 4 0 7 0

0 0 8 0 7 0 9 0 0

0 0 0 9 0 8 0 0 0

0 0 6 0 2 0 7 0 0

0 8 0 7 0 5 0 4 0

2 0 5 0 0 0 8 0 7

0 6 0 0 0 0 0 9 0

輸出7 9 3 8 5 1 4 6 2

解法一:利用dfs進行狀態搜尋(搜到一種就輸出)

#include

using

namespace std;

int a[9]

[9];

int sum=0;

bool sign=

false

;//只能輸出第一次搜尋出的正確結果

bool

check

(int key,

int n)

//檢查九個小方塊

int x=n/9;

//n的行座標

int y=n%9;

//n的列座標

//***最重要的技巧***

x=x/3*

3;y=y/3*

3;//x和y是n所在的小方塊最左上角的座標

for(

int i=x;i

3;i++

)for

(int j=y;j

3;j++)if

(a[i]

[j]==key)

return

false

;return

true;}

intdfs

(int n)

if(a[n/9]

[n%9]!=

0)else*/

//只有沒找到的情況才回溯,如果不加下面的if語句,在遞迴回退的過程中填好的空又變回去了

if(sign==

false

) a[n/9]

[n%9]=

0;//回溯 }}

}return0;

}int

main()

return0;

}

解法二:利用dfs搜尋所有結果

#include

using

namespace std;

int a[9]

[9];

int sum=0;

int s=0;

int t=0;

//輸出所有正確結果或無結果的情況

bool

check

(int key,

int n)

//九個小方塊

int x=n/9;

//n的行座標

int y=n%9;

//n的列座標

//最重要的技巧

x=x/3*

3;//n所在的小方塊最左上角的座標

y=y/3*

3;for(

int i=x;i

3;i++

)for

(int j=y;j

3;j++)if

(a[i]

[j]==key)

return

false

;return

true;}

void

shuchu()

}int

dfs(

int n)

if(a[n/9]

[n%9]!=

0)else}}

return0;

}int

main()

解法三:利用解法二找出所有數獨存在的結果,然後在結果中搜尋符合給出的數獨空缺條件的。

在解法二中輸入

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0

會搜尋出 m種結果並儲存起來,寫個程式在這些結果中搜尋即可。在搜尋時應該注意優化。

這個m看起來有點大啊,已經跑到200w了還沒結束。

乙個技巧:這個搜尋的方法好像不大行啊!!!

構造數獨和解數獨

數獨,俗稱九宮格,由乙個9 9的網格組成,整個網格又分成9個3 3的小正方形網格,每個格仔有乙個數字 1 9 數獨滿足如下要求 1 每個數字在每一行只出現一次 2 每個數字在每一列只出現一次 3 每個數字在每個3 3的小區域中也只出現一次 如下圖所示,為我們比較常見的數獨形式,為乙個缺了數字的數獨,...

每日刷題 解數獨

編寫乙個程式,通過已填充的空格來解決數獨問題。乙個數獨的解法需遵循如下規則 數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。空白格用 表示。示例 乙個數獨。答案被標成紅色。note 給定的數獨序列只包含數字 1 ...

題解 數獨 養生題

優雅的暴力 搜尋演算法小結 不過我還用了隨機化搜尋,這種搜尋思想可以防止被毒瘤出題人卡掉。有興趣的可以看一下我的一篇總結裡面寫了搜尋的一些技巧。對於實現,我的思路是.不好說,但是這樣寫搜尋又快又穩還短。以上是洛谷裝逼的話 winlere include include using namespace...