b094 z14 靶形數獨

2021-09-29 01:29:47 字數 3029 閱讀 9118

【問題描述】

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

靶形數獨的方格同普通數獨一樣,在9格寬×9格高的大九宮格有9個3格寬×3格高的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入1到9的數字。每個數字在每個小九宮格內不能重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)

上圖具體的分值分布是:最裡面一格(黃色區域)為10分,黃色區域外面的一圈(紅色區域)每個格仔為9分,再外面一圈(藍色區域)每個格仔為8分,藍色區域外面一圈(棕色區域)每個格仔為7分,最外面一圈(白色區域)每個格仔為6分,如上圖所示。比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即這每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨遊戲中,總分數為2829。遊戲規定,將以總分數的高低決出勝負。

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

【輸入】

輸入檔名為sudoku.in。一共9行。每行9個整數(每個數都在0-9的範圍內),表示乙個尚未填滿的數獨方格,未填的空格用「0」表示。每兩個數字之間用乙個空格隔開。
【輸出】

輸出檔案sudoku.out,共1行。輸出可以得到的靶形數獨的最高分數。如果這個數獨無解,則輸出整數-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

【輸出樣例1】

2829
【輸入樣例1】

0 0 0 0 0 2 4 5 3

9 0 0 0 0 8 0 0 0

7 4 0 0 0 5 0 1 0

7 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】

2852
【資料範圍】

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

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

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

【題目鏈結】:

【題解】

一道搜尋題;

有點像n皇后吧.

你要處理出所有的空白點能夠放置的數字有哪些;

1.要和這個點所在的小方塊裡面的數字不同

2.要和這個點所在的行的數字不同

3.要和這個點所在的列的數字不同

小方塊的話

點(x,y)對應了第(x-1)/3+1行、第(y-1)/3+1列的方塊;

然後列舉一行一行地列舉各個空白塊要用哪些數字就好;

但是這樣還不夠.

還得把每行的空白塊數目處理出來;

然偶把行數的空白塊從小到大排序;

優先搜尋空白塊數目較少的行.

這樣速度比較快。

空白塊的數目越少;

前面的搜尋層,所需要的列舉量就越少.

這樣可以比較快地知道這個狀態是否有沒有解;

(如果沒有解的話只要搜尋較少的層就能知道了,可以及時地退出.就這樣想吧。別琢磨了)

【完整**】

#include 

#include

#include

#define rep1(i,x,y) for (int i = x;i <= y;i++)

using

namespace

std;

const

int maxn = 10;

struct abc

;int a[maxn][maxn],point[maxn][maxn],ans = -1;

bool heng[maxn][maxn],shu[maxn][maxn],fk[4][4][maxn];

abc b[maxn];

bool cmp(abc a,abc b)

void o_o()

void dfs(int x,int y)

if (y>9)

if (a[b[x].id][y]>0)

int tx = (b[x].id-1)/3+1,ty = (y-1)/3+1;

for (int i = 1;i <= 9;i++)

if (!heng[b[x].id][i] && !shu[y][i] && !fk[tx][ty][i])

}int main()

while (x+1

<=9-quan)

while (y-1>=1+quan)

while (x-1>=1+quan)

p++;

quan++;

}rep1(i,1,9)

else

b[i].rest++;}}

sort(b+1,b+1+9,cmp);

dfs(1,1);

printf("%d\n",ans);

return

0;}

105032014138 牟平 z作業1

2 nextdate函式問題 nextdate函式說明一種複雜的關係,即輸入變數之間邏輯關係的複雜性 nextdate函式包含三個變數month day和year,函式的輸出為輸入日期後一天的日期。要求輸入變數month day和year均為整數值,並且滿足下列條件 條件1 1 month 12 否...

perl學習筆記1 z

陣列1 在perl 中,如果將乙個非整數值當作陣列的下標使用,不會造成語法錯誤,但仍然會造成邏輯錯誤。例如,在乙個陣列下標表示式中,乙個非數字的字串下標求值結果為零,因此,表示式返回的肯定是陣列中的第乙個元素。2 對於陣列來說,並不一定要求其中的所有元素都具有同樣的型別。不過,所有陣列元素至少都得為...

b550和z490哪個好

b550晶元組主機板方面,amd很可能將pcie 4.0標準應用於b550晶元組主機板上。到目前為止,amd只有x570這樣的高階晶元組主機板才支援pcie 4.0標準。據悉,技嘉總共準備了六款b550 aorus系列以及gaming系列主機板,其中gaming系列的定位應該要比aorus系列低乙個...