請你將乙個16x16的數獨填寫完整,使得每行、每列、每個4x4十六宮格內字母a~p均恰好出現一次。
保證每個輸入只有唯一解決方案。
輸入格式
輸入包含多組測試用例。
每組測試用例包括16行,每行一組字串,共16個字串。
第i個字串表示數獨的第i行。
字串包含字元可能為字母a~p或」-「(表示等待填充)。
測試用例之間用單個空行分隔,輸入至檔案結尾處終止。
輸出格式
對於每個測試用例,均要求保持與輸入相同的格式,將填充完成後的數獨輸出。
每個測試用例輸出結束後,輸出乙個空行。
輸入樣例:
--a----c-----o-i
-j--a-b-p-cgf-h-
--d--f-i-e----p-
-g-el-h----m-j--
----e----c--g---
-i--k-ga-b---e-j
d-gp--j-f----a--
-e---c-b--dp--o-
e--f-m--d--l-k-a
-c--------o-i-l-
h-p-c--f-a--b---
---g-od---j----h
k---j----h-a-p-l
--b--p--e--k--a-
-h--b--k--fi-c--
--f---c--d--h-n-
輸出樣例:fpahmjecnlbdkogi
ojmianbdpkcgflhe
lndkgfoijeahmbpc
bgcelkhpofimajdn
mfhbelpoackjgnid
cilnkdgahbmopefj
dogpihjmfnlecakb
jekafcnbgidplhom
ebofpmijdghlnkca
ncjdhbaekmofiglp
hmplcgkfiaenbdjo
akignodlbpjcefmh
kdemjifnchgaopbl
glbcdpmheonkjiaf
phnobalkmjfidceg
iafjoecgldpbhmnk
#include
#include
#include
using
namespace std;
const
int n =
16, m = n * n;
// 存放原矩陣
// 讀入時每行後面會自動加乙個 '\0',所以每個串要開到 n + 1
char str[n]
[n +1]
;// 存放每一層的原始矩陣狀態,方便恢復現場
char str2[m +1]
[n][n +1]
;// ones 表示二進位制數中幾個1 map 表示二進位制數中最後乙個 1 的位置
int ones[
1<< n]
, map[
1<< n]
;// 存放每個點可以放置的數
int state[n]
[n];
// 存放每一層的每乙個點可以放置數的狀態,方便恢復現場
int state2[m +1]
[n][n]
, state3[m +1]
[n][n]
;inline
intlowbit
(int x)
// 改變格仔填放後,行、列、4*4 宮格的狀態
void
draw
(int x,
int y,
int c)
// 找到該矩陣中左上角點在整個矩陣中對應的座標
int sx = x /4*
4, sy = y /4*
4;for(
int i =
0; i <
4; i ++)}
// 將 (x, y) 的狀態標記為以放置 c
state[x]
[y]=
1<< c;
}bool
dfs(
int cnt)
// 若改格只能放置乙個數
if(ones[s]==1
)}}}
// 列舉每一行,若某個字母不能填在任何乙個空位,直接返回
// 若某個空格只能填乙個字母,則直接填
for(
int i =
0; i < n; i ++
)// 若某個字母不能填放在該行的任意乙個位置
if(sor !=(1
<< n)-1
)for
(int j = sand; j; j -
=lowbit
(j))}}
}}// 列舉每一列,若某個字母不能填在任何乙個空位,直接返回
// 若某個空格只能填乙個字母,則直接填
for(
int i =
0; i < n; i ++)if
(sor !=(1
<< n)-1
)for
(int j = sand; j; j -
=lowbit
(j))}}
}}// 列舉每乙個 4*4 宮格,若某個字母不能填在任何乙個空位,直接返回
// 若某個空格只能填乙個字母,指直接填
for(
int i =
0; i < n; i ++)if
(sor !=(1
<< n)-1
)for
(int j = sand; j; j -
=lowbit
(j))}}
}}// 如果經過上面的步驟,已經填放完畢,則不用進行下面的步驟if(
!cnt)
return
true
;// 找可以填放數最少的空格
// 記住填放數最少的空格的座標,以及可以填放的數
int x, y, s =20;
for(
int i =
0; i < n; i ++)}
}memcpy
(state3[kcnt]
, state,
sizeof state)
;// 列舉每乙個可以填放的數
for(
int i = state[x]
[y]; i; i -
=lowbit
(i))
// 恢復現場
memcpy
(state, state2[kcnt]
,sizeof state)
;memcpy
(str, str2[kcnt]
,sizeof str)
;return
false;}
intmain()
// 當掃瞄到資料時,才繼續讀入後續資料
while(~
scanf
("%s"
,*str)
)return0;
}
數獨(Sudoku)求解程式
數獨完全求解程式 ver 3.0 coolypf 2008 11 24 22 11 include using namespace std int matrix 9 9 數獨矩陣 int count 0 解的個數 int check int x,int y,bool mark 10 檢測matrix...
求解n宮數獨
def show a,n 輸出結果 for i in range n for j in range n print a i j end print print import copy def sudoku a,n def is ok b,n def answer r,c t 0 n 1 for i ...
數獨簡單版
題目鏈結 數獨是一種傳統益智遊戲,你需要把乙個 9 9 的數獨補充完整,使得圖中每行 每列 每個 3 3 的九宮格內數字 1 9 均恰好出現一次。請編寫乙個程式填寫數獨。輸入共 9 行,每行包含乙個長度為 9 的字串,用來表示數獨矩陣 其中的每個字元都是 1 9 或 表示尚未填充 輸出補全後的數獨矩...