傳送門
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...