題解 P1074 靶形數獨

2021-10-07 22:47:47 字數 1736 閱讀 4055

看完所有的題解之後發現沒有人用二進位制,我就知道我的機會來了(手動滑稽)

x << y//相當於x * pow(2,y)

lowbit

(x)//找到x的二進位制中最小的1的位置1&

1=10

&1=0

0&0=

0//沒有了

關於這一題,line,rool,cell三個陣列(均初始化為111111111(二進位制))分別用來存這一行、列、九宮格(以0開始,方便九宮格的操作)還可以存的數有哪些,存在相對應的二進位制位上。

為了得到某乙個格仔的可以填的數,只需要乙個get函式就可以解決。

inline

intget

(int x,

int y)

就像我們平時做數獨一樣,從可以填的數最少的格仔開始列舉(數獨可以沒有這樣的剪枝)

話不多說,上**

#include

#include

using

namespace std;

const

int n=9;

int a[n]

[n];

int line[n]

,roll[n]

,cell[n/3]

[n/3];

//map是為了得到lowbit的對應的位數,once方便找這一格可以填的數的個數(類似於打表)

int map[

1<,once[

1<;bool flag;

int biao[n]

[n]=

;//暴力出奇蹟,打表過省一

int maxx,ans;

inline

void

init()

inline

intlowbit

(int x)

inline

intget

(int x,

int y)

inline

void

print()

//得到結果並判斷

void

dfs(

int cnt)

int minn=10;

int x,y;

for(

int i=

0;i)for

(int j=

0;j)//找到可填的數最少的一格

int xx=

get(x,y)

;for

(int i=xx;i;i-

=lowbit

(i))

return;}

intmain()

for(

int i=

0;i<(1

<;i++

) once[i]

=s;}

init()

;for

(int i=

0;i)for

(int j=

0;j)int cnt=0;

for(

int i=

0;i)for

(int j=

0;jdfs(cnt);if

(!flag)

printf

("-1\n");

else

printf

("%lld\n"

,maxx)

;return0;

}

P1074 靶形數獨 題解

原題傳送門 不愧是 2009 noip tg t4 連續打了4天的 吸了口氧才通過。前置知識 對於一道數獨題,我們可以先預處理出每一行0的個數,然後從個數最少的行開始做,這樣可以節省大量的時間 因為這些格仔可以填的數字少 對於本題,我一開始的思路是 仿照前置知識預處理,分數進行打表,存在 poi n...

題解 P1074 靶形數獨

來一篇通俗點的dlx的題解。有關dlx的講解 針對本題的一些細節詳見注釋。code include include includeusing namespace std const int maxn 81 4 5 const int maxnode 9 9 9 4 4 5 const int slo...

P1074 靶形數獨

小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 999 格寬 999 格高的大九宮格中有 ...