洛谷P1074 靶形數獨

2021-09-12 12:01:28 字數 1695 閱讀 3934

description:

寫乙個做數獨的程式,但是這個數獨有一點不同的是,每個格仔有乙個權值,權值與在格仔上的數字乘積之和為總分,求最大能有多少分。

格仔的權值規律如下

從白色的框到**,依次為6,7,8,9,10

input:

數獨局面

output:

answer

analysis:

框架上就是dfs搜尋,但是要有乙個貪心的策略是,從有最少空格的行開始,因為,越少的空格在某一行就越能確定答案,可以減少dfs樹的深度。裡面還有一些細節,比如get_point函式的寫法上就有遞推的意思。

#define _crt_secure_no_warnings  

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define _for(i,a,b) for(int i=(a);i

#define _rep(i,a,b) for(int i=(a);i<=(b);++i)

typedef long long ll;

const int inf = 1 << 30;

const int maxn = 11;

const int mod = 1e9 + 7;

const double eps = 1e-6;

const double pi = acos(-1);

int pic[maxn][maxn],n,tot_id;

int vis[3][10][10],ans;

vector> rows;

vector < pair>id2cor;

inline int get_grid(int r, int c)

inline int get_point(int r, int c)

inline bool ok(int r, int c, int g,int num)

void precal() );

} sort(rows.begin(), rows.end());

ans = -1;

memset(vis, 0, sizeof(vis));

_rep(i,1,n)

_rep(j, 1, n) if(pic[i][j])

tot_id = 0;

id2cor.resize(81);

for(auto it:rows) ;

} }}int cal()

return res;

}void dfs(int depth)

int row = id2cor[depth].first, col = id2cor[depth].second;

int g = get_grid(row, col);

_rep(num, 1, n) }}

int main()

precal();

dfs(0);

cout << ans << endl;

return 0;

}

洛谷 P1074 靶形數獨

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

洛谷P1074 靶形數獨

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

洛谷P1074 靶形數獨

這道題單獨以每個位置遞迴純暴力搜尋的話,複雜度9 81,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,...