又是hash拯救世界啊,三進製的 靶型數獨

2022-03-21 07:13:02 字數 2228 閱讀 4737

【題目描述】

小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向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】

【輸出樣例 2】

【分析】

hash找到九宮格的位置,每次搜尋可以填的數的最少的格仔。

#include #include bool cani[11][11],canj[11][11],canx[11][11],canp[111];

int xx[111],yy[111];

int tot,max,p,x;

int mark(int x,int y)

int hash(int x,int y)

void search(int step,int ans)

int min = 999999,t,w = 0;

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

if (w < min)

} if (!min)

return;

canp[t] = 0;

for (int j = 1;j < 10;++j)

if ((cani[xx[t]][j]) && (canj[yy[t]][j]) && (canx[hash(xx[t],yy[t])][j]))

canp[t] = 1;

}int main() else

}search(1,p);

if (!max)

printf("-1\n");

else

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

return 0;

}

中國能否拯救世界

中國能拯救世界嗎?zt 這是最新一期美國 時代 週刊 10日出版 的封面標題。在西方主流 大都對中國充滿挑剔和偏見的時候,時代 週刊對華的溢美之辭顯得非比尋常。這一方面說明西方 審視中國的視野客觀許多,但也警示中國小心,不要為西方主流 吹捧而飄飄然。中國還是要有自知之明!事實證明,中國經濟絕非金融危...

LGP2000 拯救世界

6的倍數 1 1 x 6 最多9塊 1 x 10 1 x 最多5塊 1 x 6 1 x 4的倍數 1 1 x 4 最多7塊 1 x 8 1 x 2的倍數 1 1 x 2 最多1塊 1 x 2 1 x 1 x 8的倍數 1 1 x 8 10的倍數 1 1 x 10 最多3塊 1 x 4 1 x 分子 ...

Luogu2000 拯救世界

生成函式的入門題吧。我們可以把條件限制轉化為生成函式,然後用第i項的係數來表示一共使用n塊石頭的方案個數。你問我為什麼?你可以自己演算一下,或者去看大佬的部落格 這裡面講的是生成函式基礎 這些約束條件的生成函式分別為 我們展開就是答案 c 至於為什麼轉化到了組合數呢?因為5個 frac 就相當於五個...