小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的「靶形數獨」,作為這兩個孩子比試的題目。
靶形數獨的方格同普通數獨一樣,在 9 格寬×9 格高的大九宮格中有9 個 3 格寬×3 格高的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入 1 到 9 的數字。每個數字在每個小九宮格內不能重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)
上圖具體的分值分布是:最裡面一格(黃色區域)為 10 分,黃色區域外面的一圈(紅色區域)每個格仔為 9 分,再外面一圈(藍色區域)每個格仔為 8 分,藍色區域外面一圈(棕色區域)每個格仔為 7 分,最外面一圈(白色區域)每個格仔為 6 分,如上圖所示。比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和
總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨遊戲中,總分數為 2829。遊戲規定,將以總分數的高低決出勝負。
由於求勝心切,小城找到了善於程式設計的你,讓你幫他求出,對於給定的靶形數獨,能夠得到的最高分數。
直接dlx
\operatorname
dlx。
跑到最大即可。
但有一點要注意:
for
(int j=r[i]
;j!=i;j=r[j]
)remove
(col[j]);
for(
int j=l[i]
;j!=i;j=l[j]
)resume
(col[j]
);
執行這兩個操作時,一定要不同方向列舉,不然會超時。
#include
#include
#include
#include
#include
using
namespace std;
const
int g[10]
[10]=
,,,,
,,,,
,};const
int w[10]
[10]=
,,,,
,,,,
,};const
int n=
330;
const
int m=
3300
;int l[m]
,r[m]
,col[m]
,row[m]
,u[m]
,d[m]
,sz[n]
,num,head;
int ans,a[n]
;void
remove
(int p)
void
resume
(int p)
void
link
(int i,
int j)
void
make
(int i,
int j,
int k)
bool flag;
bool
dance
(int val)
int p=r[0]
;for
(int i=r[p]
;i;i=r[i])if
(sz[i]
)p=i;
remove
(p);
for(
int i=u[p]
;i!=p;i=u[i]
)resume
(p);
return flag;
}int
main()
if(dance(0
))printf
("%d\n"
,ans)
;else
puts
("-1");
return0;
}
NOIP2009 靶形數獨
爆搜沒什麼好說的。剪枝思路 一開始將每個點可能取的值的數量統計出,排序,從小到大搜 然後貪心可行性 就是剩下的地方都填9,得分10 不過在vj上測85。日。加了卡時,2e7次之內跳出,總算過了。include include include include include include inclu...
NOIP 2009 靶形數獨
題目描述 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高的大九宮格中有...
noip2009 靶形數獨
靶形數獨 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高的大九宮格中...