洛谷P1074 靶形數獨

2021-09-06 23:55:26 字數 1160 閱讀 8730

這道題單獨以每個位置遞迴純暴力搜尋的話,複雜度9^81,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,顯然先搜尋情況少的,容易很快剪掉很大的一棵棵子樹,先搜情況多的則達不到這樣的效果。因此按每行的空位排序,空位少的行優先搜尋,顯然在實際玩數獨遊戲時,也是這樣的方法。

這題寫的遇到了很多的曲折。

先是想著以一行為單位,遞迴9次,但顯然,這樣的思路是沒有辦法寫出**的。

改變思路以一格為單位,遞迴81次,又想到了乙個貪心,越靠近中間分數越高,那就優先填大數字,等到搜尋到第一組可行解時,就把它作為最優解,但顯然,以及一般情況下,這樣的貪心都是大錯特錯的。

然後用先搜尋衝突少的地方的方法來寫,對於整個9*9方陣按每個點行列宮已有數排序,設定好搜尋完每乙個點後的下乙個點,寫了120+行,tle得很慘。原因是:假如每一行有5個空位,按上面的方法,先搜一下這裡,下次跳到很遠的地方搜一下,右跳到別處...而這樣幾次沒有相互干擾,這樣不利於剪枝。

因此,最後策略:按每行的空位排序,空位少的行優先搜尋這一行,這一行搜尋完才搜尋其他行。在實際玩數獨遊戲時也是這樣的方法。

交上去re,結果是因為在函式裡面定義的陣列並不賦初值0,使用裡面的值越界了,把它當全域性變數用了...

改了以後終於ac了。

#includeusing namespace std;

int n=9,a[10][10],num[10][10],ans=-1;

int row[10][10],col[10][10],block[10][10];

int nxt[10],hang[10];

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

,,,,

,,,};

inline int block(int i,int j)

bool cmp(int i,int j)

void init() }

int d[10]=;for(int i=1;i<=n;i++)d[i]=i;

sort(d+1,d+1+n,cmp);

for(int i=0;i=1;i--) }

int main()

洛谷 P1074 靶形數獨

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

洛谷P1074 靶形數獨

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

洛谷P1074 靶形數獨

description 寫乙個做數獨的程式,但是這個數獨有一點不同的是,每個格仔有乙個權值,權值與在格仔上的數字乘積之和為總分,求最大能有多少分。格仔的權值規律如下 從白色的框到 依次為6,7,8,9,10 input 數獨局面 output answer analysis 框架上就是dfs搜尋,但...