NOIP2009 靶形數獨

2022-05-08 04:18:12 字數 2637 閱讀 9837

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

靶形數獨的方格同普通數獨一樣,在 9 格寬×9 格高的大九宮格中有 9 個 3 格寬×3 格高的小九宮格(用粗黑色線隔開的)

。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入 1到 9

的數字。每個數字在每個小九宮格內不能重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即每乙個方格都有乙個分值,而且

如同乙個靶子一樣,離中心越近則分值越高。 (如圖)

上圖具體的分值分布是:最裡面一格(黃色區域)為 10 分,黃色區域外面的一圈(紅色區域)每個格仔為 9

分,再外面一圈(藍色區域)每個格仔為 8分,藍色區域外面一圈(棕色區域)每個格仔為 7分,最外面一圈(白色區域)每個格仔為 6

分,如上圖所示。比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法)

,而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨

遊戲中,總分數為 2829。遊戲規定,將以總分數的高低決出勝負。

由於求勝心切,小城找到了善於程式設計的你,讓你幫他求出,對於給定的靶形數獨,能夠得到的最高分數。

一共 9 行。每行 9 個整數(每個數都在 0—9 的範圍內) ,表示乙個尚未填滿的數獨方格,未填的空格用「0」表示。每兩個數字之間用乙個空格隔開。

輸出可以得到的靶形數獨的最高分數。如果這個數獨無解,則輸出整數-1。

樣例1:

7 0 0 9 0 0 0 0 1

1 0 0 0 0 5 9 0 0

0 0 0 2 0 0 0 8 0

0 0 5 0 2 0 0 0 3

0 0 0 0 0 0 6 4 8

4 1 3 0 0 0 0 0 0

0 0 7 0 0 2 0 9 0

2 0 1 0 6 0 8 0 4

0 8 0 5 0 4 0 1 2

樣例2:

0 0 0 7 0 2 4 5 3

9 0 0 0 0 8 0 0 0

7 4 0 0 0 5 0 1 0

1 9 5 0 8 0 0 0 0

0 7 0 0 0 0 0 2 5

0 3 0 5 7 9 1 0 8

0 0 0 6 0 1 0 0 0

0 6 0 9 0 0 0 0 1

0 0 0 0 0 0 0 0 6

樣例1:

2829

樣例2:

2852

我們先找到乙個可填的數的數量最小的那個填數,這樣更容易得出答案.

所以每次都找到可填的數的數量最小的那個地方搜尋,這樣可以減少很多狀態量.

1 #include

2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include12 #include13 #include14

#define ll long long

15#define rg register

16using

namespace

std;

17int mp[10][10],vis1[10][10],vis2[10][10],vis3[10][10

];18

int w[10][10]=,,,,,,,,,};

19int kt[10][10]=,,,,,,,,,};

20 ll ans=-1;int sum=0;21

struct

datapo[100

];24

bool bj[100

];25 inline void

answer()

2633 inline void dfs(int

now)

3436

int zd=100

,kp;

37for(int i=1;i<=sum;i++)

3841 bj[kp]=1;42

int x=po[kp].x,y=po[kp].y;

43for(rg int k=1;k<=9;k++)

44if(!vis1[x][k] && !vis2[y][k] && !vis3[kt[x][y]][k])

55 dfs(now+1

);56 vis1[x][k]=0,vis2[y][k]=0,vis3[kt[x][y]][k]=0

;57 mp[x][y]=0;58

for(rg int i=1;i<=sum;i++)

5966

}67 bj[kp]=0;68

}69intmain()

7088 dfs(1

);89 printf("

%lld

",ans);

90return0;

91 }

NOIP2009 靶形數獨

爆搜沒什麼好說的。剪枝思路 一開始將每個點可能取的值的數量統計出,排序,從小到大搜 然後貪心可行性 就是剩下的地方都填9,得分10 不過在vj上測85。日。加了卡時,2e7次之內跳出,總算過了。include include include include include include inclu...

NOIP 2009 靶形數獨

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

noip2009 靶形數獨

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