搜尋 P1074 靶形數獨 搜尋

2021-09-13 12:42:14 字數 2912 閱讀 5516

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

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

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

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

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

輸入格式:

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

輸出格式:

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

輸出樣例#2

2852
【資料範圍】

40%的資料,數獨中非 00 數的個數不少於3030。

80%的資料,數獨中非 00 數的個數不少於2626。

100%的資料,數獨中非00數的個數不少於2424。

noip 2009 提高組 第四題

搜尋,其實挺好想,但是**特別難。(本思路非原創,看了題解)

#include #include #include #include using namespace std;

int s(-1),row[16][16],col[16][16],area[16][16],sdk[16][16];

int score[10][10]=,,

,,,,

,,,};

int cnt,cnt_row[16],cnt_col[16];

inline int pid(int i,int j)

inline int lxydl()

} return wwz;

}void dfs(int r,int c,int xsy)

register int i,j,k;

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

row[r][i]=1;

col[c][i]=1;

area[pid(r,c)][i]=1;

cnt_row[r]++;

cnt_col[c]++;

sdk[r][c]=i;

int sr(-1),sc(-1);

int nextr(0),nextc(0);

sr=sc=-1;

for(j=1;j<=9;j++)

}for(j=1;j<=9;j++)

}dfs(nextr,nextc,xsy+1);

row[r][i]=0;

col[c][i]=0;

area[pid(r,c)][i]=0;

cnt_row[r]--;

cnt_col[c]--;

sdk[r][c]=0;

} //return;

}signed main()

} }int sr,sc,r,c;

sr=sc=-1;

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

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

dfs(r,c,cnt);

cout<

return 0;

}

P1074 靶形數獨

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

P1074 靶形數獨

p1074 靶形數獨 比賽的要求是 每個人必須完成乙個給定的數獨 每個給定數獨可能有不同的填法 而且要爭取更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字的乘積的總和 輸入格式 一共 99 行。每行99個整數 每個數都在 0 9的範圍內 表示乙個尚未填滿的數獨方格,未填...

P1074 靶形數獨

題意 給你乙個未完成的數獨,每個位置上的價值等於數字乘上位置的價值 類似於打靶子 要點 1.巧妙利用打表便於搜尋與判斷 2.貪心思想大量減少搜尋的分支 每行 列 選0的個數少的填,減少了分支 不加此剪枝tle一片。1 剛開始別忘了加上初始的數的value 2 打表注意 0 0 都是 0,因為打錯表找...