數獨是乙個非常有名的遊戲。整個是乙個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...