codevs 1174 靶形數獨 (啟發式搜尋)

2021-08-09 19:04:14 字數 2077 閱讀 3547

*ps:卡常什麼的最討厭了

go to the problem

因為題面太長所以並不想粘qwq

第一遍打的暴搜,codevs 上90,洛谷75,感覺自己萌萌的。

結果打完啟發函式後,codevs上a了,洛谷上一直t掉乙個點qaq,優化了一晚上,還是t掉(而且這個點暴搜沒t),最後放棄了… t _ t

方法就是每次都從可能性最小的點開始搜,記一下每行每列每宮裡已經填了的數的種類,從種類最多的開始搜(也可以加上已經填了的數量)。同時記得打表(分數,宮也可以)。

當然你也可以考慮每次從0最少的地方開始搜,或者進行最優化剪枝(當前還沒填的數的個數*90+當前得分<=ans return)、或者用inline、register或o2優化、加上位運算或手讀、從9到1倒著列舉、能用char的用char…

#include

#include

#include

#include

#include

using namespace std;

int cnt,ans=-1,sum;

int a[10][10],hang[10][10],lie[10][10],gong[10][10][10];

int ch[10],cl[10],cg[10][10];

struct maplepoint[100];

int score[10][10]=,,,

,,,,

,,};

bool cmp(maple a,maple b)

void done_used(int i,int j,int k,int d,int d2)

void dfs(int k,int sum) //填到第k個數,總值為sum

int x=point[k+1].x,y=point[k+1].y;

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

if(!hang[x][i]&&!lie[y][i]&&!gong[(x-1)/3][(y-1)/3][i])

}int main()

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

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

if(!a[i][j])

point[++cnt]=(maple);

dfs(0,sum);

printf("%d",ans);

return 0;

}

#include

#include

#include

#include

#include

using

namespace

std;

int cnt,ans=-1,sum;

int a[10][10],hang[10][10],lie[10][10],gong[10][10][10];

struct maplepoint[100];

int score[10][10]=,,,

,,,,

,,

}; void done_used(int i,int j,int k,int d,int l,int r)

int done_data()

}return pos;

}void dfs(int k,int sum) // 填到第k個數,總值為sum

if(sum+(cnt-k)*90

<=ans) return;

int j=done_data();

int x=point[j].x,y=point[j].y;

int l=(x-1)/3,r=(y-1)/3;

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

if(!hang[x][i]&&!lie[y][i]&&!gong[l][r][i])

}int main()

; else done_used(i,j,a[i][j],1,(i-1)/3,(j-1)/3);

}dfs(0,sum);

printf("%d",ans);

return

0;}

codevs1174 靶形數獨

題目鏈結 題解 可以預處理出已經填數字比較密集的區域開始搜尋來減少後續決策數 include include include using namespace std const int n 9 int s,tot,ans int a 10 10 struct dataf 10 10 int fen ...

靶形數獨(codevs 1174)

2009年noip全國聯賽提高組 時間限制 4 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解檢視執行結果 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向z 博士請教,z 博士...

codevs1174 靶形數獨

從wyh大佬那裡蹭來了乙份dlx的題解,然後進行了一番深刻的理解,最後自己手打了一遍,感覺受益頗多,最主要的是這個 融合了很多卡常技巧2333333333 和普通的dfs不同,這份 從根進行剪枝,每一層都取方案數最小的位置進行搜尋,因而得到十分顯著的優化,原來乙個點4s的題,現在20個點總共用時加起...