利用電腦程式快速得到9 9大小數獨的解法

2021-10-19 05:23:38 字數 3050 閱讀 9518

對於 9∗9

9*99∗

9 大小的數獨遊戲,我們可以使用回溯法求得其正確的解,但是,一般的回溯法實現這個過程保證不了時間複雜度,所以我們可以利用二進位制壓縮的方法來優化其過程。

具體思路如下:

明確數獨的約束:

定義row[

i]row[i]

row[i]

陣列代表,第i,j

i,ji,

j位置,在 i

ii 行哪些數被占用,用二進位制 1

11 表示沒有被占用,0

00 表示被占用那麼最開始 row

[i]row[i]

row[i]

= 111111111

111111111

111111

111,表示行沒有數被占用。

定義c ol

[j]col[j]

col[j]

陣列代表,第i,j

i,ji,

j位置,第 j

jj 列哪些數被占用,用二進位制 1

11 表示沒有被占用,0

00 表示被占用,那麼最開始col

[i]col[i]

col[i]

= 111111111

111111111

111111

111,表示列沒有數被占用。

定義c el

l[i/

3][j

/3]cell[i/3][j/3]

cell[i

/3][

j/3]

陣列代表,第 i,j

i,ji,

j 格所在的宮中那些數被占用,用二進位制 1

11 表示沒有被占用,0

00 表示被占用,那麼最開始cel

l[i/

3][j

/3]cell[i/3][j/3]

cell[i

/3][

j/3]

= 111111111

111111111

111111

111,表示宮中沒有數被占用。

然後我們需要初始化上面三個陣列,因為一開始的數獨遊戲位置被一些數占用了,那麼這些數的位置就會影響row

[i],

col[

j],c

ell[

i][j

]row[i],col[j],cell[i][j]

row[i]

,col

[j],

cell

[i][

j]的二進位制數,我們需要把相應的數,在二進位制數的響應位改變成0,表示這個數在此列或行或宮被占用了。

然後我們利用位運算&對三個陣列進行&,就可以得到三個陣列都沒有被占用的數,然後從其中挑選數,進行回溯法即可得到數獨的解。

注意要熟悉:low

bit(

)lowbit()

lowbit

()的用法,是取二進位制數第一次出現1

11時的大小,例如100100

100100

100100

,這個數的low

bit(

)lowbit()

lowbit

()就是100

10010

0,在這個程式中他用來取&後的數字的二進位制可用數是多少,這個可用數我們也提前預處理,對映到了map

mapma

p陣列裡,然後這個還有乙個貪心策略,即當可用數越少答案就越確定,我們用one

sones

ones

陣列記錄一下所有可出現狀態的1的數量,1的數量少代表當前位置越確定,這個可以對程式執行很大的優化。

下面以乙個數獨遊戲為例:

被解決的數獨遊戲:

程式跑出的解:

輸入的時候空位置用.代替即可

可執行**:

#include

#include

using

namespace std;

const

int n =9;

int row[n]

, col[n]

, cell[3]

[3], ones[

1<< n]

, map[

1<< n]

, cnt;

char s[n]

[n];

inline

intlowbit

(int x)

inline

void

init()

inline

intget

(int x,

int y)

bool

dfs(

int cnt)}}

}for

(int i =

get(x, y)

; i; i -

=lowbit

(i))

return

false;}

intmain()

ones[i]

= k;

}while

(true

)else}}

dfs(cnt)

;for

(int i =

0; i < n; i++

) cout << endl;}}

return0;

}

在家如何用電腦賺錢 工作之餘在家如何利用電腦賺錢

現在的電腦非常的普及,可以說很多人家裡面都有電腦,但是很多人只會用自己的電腦聽聽歌打打遊戲,而不會用電腦來賺錢,其是這一實種浪費,既浪費了自己的時間,也浪費了電腦的效能。現在網際網路這麼發達,我們想要利用電腦賺錢其實是非常容易的,我們隨便在網上找一下就可以找到很多賺錢的專案的,不過有很多專案不靠譜,...

利用構建素數表的方法快速得到素數

今天在東華oj上做了一道題,基礎部分第40題 分拆素數和,涉及到素數。我覺得題目不難,我是這樣寫的 t40 分拆素數和 演算法概述 對於乙個偶數num,從2到num 2 1依次測試拆分是否滿足要求 include include 判斷是否為素數 int isprim int x return 1 i...

利用電腦自帶的效能監視器進行資源監控

摘要 在效能測試中,你要對測試結果進行資料分析,就要對系統資源進行監控,並對監控資料進行分析,而windows效能計數器在幫助查詢軟體產品效能瓶頸中的作用以及使用方法等,為開發 測試以及系統分析人員介紹一種簡潔高效效能跟蹤評估手段。1 概述 軟體產品常常會出現這樣的情況 產品效能因某些無法預料的瓶頸...