數獨高階版求解

2021-10-17 20:42:19 字數 3584 閱讀 2268

請你將乙個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 或 表示尚未填充 輸出補全後的數獨矩...