#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]
[10];
//存行,列,宮1~9的使用情況
int point_reach[
100][4
];//存到達點的x,y,box,value
int temp_max =-1
;//初始化答案
int point_counter;
//到達點的計數器
int origin_value;
//數獨原有已填數的價值和
intconsult_box
(int x,
int y)
//查詢在第幾宮
intconsult_value
(int i,
int j)
//查詢乙個位置的價值數
if(i ==
2|| i ==
8|| j ==
2|| j ==8)
if(i ==
3|| i ==
7|| j ==
3|| j ==7)
if(i ==
4|| i ==
6|| j ==
4|| j ==6)
return10;
}void
dfs(
int point_num_reach,
int total_value_now)
//字面意
return;}
for(
int i =
1; i <=
9; i++
)//分1~9填數}}
bool
cmp(consult_row_0 a, consult_row_0 b)
//排序用
intmain()
for(
int i =
1; i <=
9; i++
)else}}
sort
(dic_row_0 +
1, dic_row_0 +
10, cmp)
;//按行中0個數公升序排序
for(
int i =
1; i <=
9; i++
)//依次訪問點}}
dfs(
0, origin_value)
;//遞迴
cout << temp_max << endl;
//輸出
return0;
//完工大吉
}
對於行中未知數個數公升序排序,減少搜尋次數,然後電風扇 luogu P1074 靶形數獨
比較基礎的搜尋剪枝題。幾個優化就可以過了 用lowbit代替查詢可以填的數 用並集來維護什麼數不能填 優先考慮 最小可能性的位置 講道理我用堆維護還t了。然後就可以在 m n是數獨大小,m是可以填的種類數量 解決 實際測試中,遠遠不到這個上界 include using namespace std ...
luogu P1074 靶形數獨
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 99 格寬 99 格高的大九宮格中有 99...
luoguP1074 靶形數獨(搜尋)
傳送門 75分,太菜,不會優化了,吐了。幾點優化。1.先搜尋容易確定的位置 2.從中心往周圍搜 3.列舉數字的時候倒序列舉 4.如果沒有列舉到的數字都是最優情況的話也不能比當前ans大就剪枝 5.位運算 include include include define max x,y x y x y d...