洛谷 P1074 靶形數獨

2021-08-09 08:48:14 字數 3174 閱讀 1874

p1074 靶形數獨

小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他

們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,

z 博士拿出了他最近發明的「靶形數獨」,作為這兩個孩子比試的題目。

靶形數獨的方格同普通數獨一樣,在 9 格寬×9 格高的大九宮格中有 9 個 3 格寬×3 格

高的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入 1 到 9 的數字。每個數字在每個小九宮格內不能

重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即

每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)

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

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

色區域)每個格仔為 7 分,最外面一圈(白色區域)每個格仔為 6 分,如上圖所示。比賽的

要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取

更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字

的乘積的總和

總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字

的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨遊戲中,總分數為 2829。遊戲規定,將以總分數的高低決出勝負。

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

夠得到的最高分數。

輸入格式:

一共 9 行。每行 9 個整數(每個數都在 0―9 的範圍內),表示乙個尚未填滿的數獨方

格,未填的空格用「0」表示。每兩個數字之間用乙個空格隔開。

輸出格式:

輸出檔案 sudoku.out 共 1 行。

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

輸入樣例#1:

sudoku1

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

sudoku2

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:

sudoku1

2829

sudoku2

2852

【資料範圍】

40%的資料,數獨中非 0 數的個數不少於 30。

80%的資料,數獨中非 0 數的個數不少於 26。

100%的資料,數獨中非 0 數的個數不少於 24。

noip 2009 提高組 第四題

搜尋練手的好題 

普通的搜尋只有 75分 

所以我們可以倒著搜 

乙個乙個遍歷 要搜的點太麻煩 

我們可以記錄要搜的點 

還可以限制遞迴層數 

或者 (當前未搜尋點的個數)*10+已有的分數

1 #include 2 #include 3 #include 4

5const

int maxn=10;6

7int

ans,v,deep;89

int m[maxn][maxn],nedx[maxn*maxn],nedy[maxn*maxn],need;

1011

int val[maxn][maxn]=,

12 ,

13 ,

14 ,

15 ,

16 ,

17 ,

18 ,

19 ,

20 ,};

2122

bool

h[maxn][maxn],l[maxn][maxn],g[maxn][maxn];

2324 inline void read(int&x)

2930 inline int cal(int i,int

j) 41

42void dfs(int sum,int

w) 48

//if(sum*10+w49

int x=nedx[sum],y=nedy[sum];

50int k=cal(x,y);

51for(int i=1;i<=9;++i) 57}

5859

inthh()

69else 73

}74 v=ans;

75dfs(need,ans);

76if(ans==v) printf("

-1\n");

77else printf("

%d\n

",ans);

78return0;

79}8081

int sb=hh();

82int main(int argc,char**argv)

**

洛谷P1074 靶形數獨

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

洛谷P1074 靶形數獨

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

洛谷P1074 靶形數獨

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