洛谷 P1074 靶形數獨 搜尋,水題

2021-09-26 23:13:59 字數 2570 閱讀 3591

展開

題目描述

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

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

上圖具體的分值分布是:最裡面一格(黃色區域)為 1010 分,黃色區域外面的一圈(紅色區域)每個格仔為 9 9分,再外面一圈(藍色區域)每個格仔為 88 分,藍色區域外面一圈(棕色區域)每個格仔為 7 7分,最外面一圈(白色區域)每個格仔為 6 6分,如上圖所示。比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和

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

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

輸入格式

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

輸出格式

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

輸出2829

輸入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

輸出2852

算是八皇后的變種,每次算出來乙個ans時要給各個點乘乙個權值,比較有意思的是要先給地圖的每行缺少的個數排個序,先填空少的,要不然會t;

然後就是寫起來比較麻煩。

#include

using

namespace std;

const

int n=10;

int a[n]

[n],ans[n]

[n],vis[3]

[n][n]

,b[82

],maxn,flag;

struct rowrow[n]

;//排序規則:按照行的0的個數從小到大

intcmp

(row row1,row row2)

//獲取x,y在哪乙個小九宮格子中

intgetgrid

(int x,

int y)

if(x>=

4&&x<=6)

if(x>=

7&&x<=9)

}//獲取x,y位置對應的分數

intgetscore

(int x,

int y)

//計算當前組合按照規則計算出來的結果

intcal()

void

dfs(

int xh)

int x=b[xh]/9

+1;//現在這個序號對應的是第x行,第y列

int y=b[xh]%9

;if(y==0)

x=b[xh]/9

,y=9;if

(!a[x]

[y])}}

else

dfs(xh+1)

;}void

init()

} row[i]

.h=i,row[i]

.zero_cnt=cnt;

//記錄每一行有幾個0

}sort

(row+

1,row+1+

9,cmp)

;//優先安排0少的行

int num=0;

for(

int i=

1;i<=

9;i++

)//儲存乙個交換行序以後的搜尋順序的陣列}}

intmain()

洛谷 P1074 靶形數獨

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

洛谷P1074 靶形數獨

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

洛谷P1074 靶形數獨

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