luoguP1074 靶形數獨(搜尋)

2022-03-01 07:57:54 字數 1154 閱讀 2404

傳送門

75分,太菜,不會優化了,吐了。

幾點優化。

1.先搜尋容易確定的位置

2.從中心往周圍搜

3.列舉數字的時候倒序列舉

4.如果沒有列舉到的數字都是最優情況的話也不能比當前ans大就剪枝

5.位運算

#include #include #include #define max(x, y) ((x) > (y) ? (x) : (y))

#define tu(i, j) (((i) - 1) / 3 * 3 + ((j) - 1) / 3 + 1)

int ans = -1, cnt;

int hang[10], lie[10], jiu[10], shu[10], a[10][10], num[10][10], point[11];

struct node

}p[101];

inline int read()

inline bool cmp(node x, node y)

inline int pd(int x, int y)

inline bool check(int sum)

return sum > ans;

}inline void dfs(int x, int y, int k, int sum)

for(int i = 9; i >= 1; i--)

if(!(hang[x] & (1 << i - 1)) && !(lie[y] & (1 << i - 1)) && !(jiu[tu(x, y)] & (1 << i - 1))) }

int main()

} for(i = 1; i <= 9; i++)

for(j = 1; j <= 9; j++)

for(i = 1; i <= 9; i++)

for(j = 1; j <= 9; j++)

if(!a[i][j])

p[++cnt] = node(pd(i, j), i, j, num[i][j]);

std::sort(p + 1, p + cnt + 1, cmp);

dfs(p[1].x, p[1].y, 1, sum);

printf("%d\n", ans);

return 0;

}

Luogu P1074 靶形數獨

include using namespace std struct consult row 0 struct consult row 0 dic row 0 10 查詢第幾行有幾個0 int origin 10 10 輸入的數獨 bool row 10 10 column 10 10 box 10...

luogu P1074 靶形數獨

比較基礎的搜尋剪枝題。幾個優化就可以過了 用lowbit代替查詢可以填的數 用並集來維護什麼數不能填 優先考慮 最小可能性的位置 講道理我用堆維護還t了。然後就可以在 m n是數獨大小,m是可以填的種類數量 解決 實際測試中,遠遠不到這個上界 include using namespace std ...

luogu P1074 靶形數獨

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