題解 靶形數獨

2021-08-21 05:07:44 字數 1909 閱讀 8439

題目簡述:

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

靶形數獨的方格同普通數獨一樣,在 9

9 格寬× 9

9 格高的大九宮格中有 9

9 個 3

3 格寬× 3

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

1 到 9

9的數字。每個數字在每個小九宮格內不能重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)

上圖具體的分值分布是:最裡面一格(黃色區域)為 1010

分,黃色區域外面的一圈(紅色區域)每個格仔為 9

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

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

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

6 分,如上圖所示。比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和

總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨遊戲中,總分數為 2829。遊戲規定,將以總分數的高低決出勝負。

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

分析:這道題我當時一看下意識就想到了手打暴力……(不存在的),但是後來我看了會兒題目後突然發現這個手打暴力會萎掉(畢竟情況有n多種)。

所以,我們開始考慮dfs。

我們先從題目的條件入手,想要dfs不超時,就得多考慮,剪枝幾種情況。根據題意可以知道,我們填數時這一行有的數不能填,這一列有的數也不能填,這一九宮格裡有的數又不能填。

那麼我們可以用f1[i][j]表示這一行有沒有填過數字j;f2[i][j]表示這一列有沒有填過數字j;f3[i][j]表示這一九宮格有沒有填過數字j。這樣一來,情況就減少了很多。

那麼f1和f2的儲存很簡單,直接存行和列

但是九宮格怎麼儲存呢?

首先,我們從左到右,從上到下將九宮格進行編號,如下:

不難發現,因為每乙個小九宮格都是3行3列的,所以我們可以得到以下式子:

當前格仔屬於的九宮格=(x-1)/3*3+(y-1)/3+1(其實x,y)為當前各自座標

那麼具體**如下:

#includeusing namespace std;

int a[101][101]={};

int k[10][10]=;

int maxx=0,s=0;

bool f1[101][101]={},f2[101][101]={},f3[101][101]={};

void dfs(int x,int y,int ans)

if (x>9)

if (a[x][y]>0)

else

} }int main()

dfs(1,1,0);

printf("%d",maxx==0?-1:maxx);

return 0;

}

靶形數獨 (codevs 1174)題解

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

NOIP2009 靶形數獨 題解

題目名稱 靶形數獨 題目 noip2009 時間限制 2000ms 空間限制 128m 問題描述 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向z博士請教,z博士拿出了他最近發明的 靶形數獨 作為這兩個...

P1074 靶形數獨 題解

原題傳送門 不愧是 2009 noip tg t4 連續打了4天的 吸了口氧才通過。前置知識 對於一道數獨題,我們可以先預處理出每一行0的個數,然後從個數最少的行開始做,這樣可以節省大量的時間 因為這些格仔可以填的數字少 對於本題,我一開始的思路是 仿照前置知識預處理,分數進行打表,存在 poi n...