對於 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 概述 軟體產品常常會出現這樣的情況 產品效能因某些無法預料的瓶頸...