(sudoku.pas/c/cpp)
【問題描述】
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他
們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向z博士請教,
z博士拿出了他最近發明的「靶形數獨」,作為這兩個孩子比試的題目。
靶形數獨的方格同普通數獨一樣,在9格寬×9格高的大九宮格中有9個3格寬×3格
高的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些
數字,利用邏輯推理,在其他的空格上填入1到9的數字。每個數字在每個小九宮格內不能
重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即
每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)
上圖具體的分值分布是:最裡面一格(黃色區域)為10分,黃色區域外面的一圈(紅
色區域)每個格仔為9分,再外面一圈(藍色區域)每個格仔為8分,藍色區域外面一圈(棕
色區域)每個格仔為7分,最外面一圈(白色區域)每個格仔為6分,如上圖所示。
比賽的要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取
更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字
的乘積的總和。
由於求勝心切,小城找到了善於程式設計的你,讓你幫他求出,對於給定的靶形數獨,能
夠得到的最高分數。
解題思路:很顯然的搜尋題嘛。。。搜尋題就是優化,剪枝的問題了。。比如我們可以預處理出待填數的位置,這個還是很有用的。。然後從填了比較多數的行、列和塊開始填數,,(這個大概可以寫乙個估價函式?)還有用位運算可以快很多,,不過我的**沒有,,因為是以前寫的。。另外各種倒著搜貌似都會更快(noip的慣例?)。。我的**還有乙個過不了的點,,每次搜尋題都是這樣。。。這題還有比較神的做法,,就是dancinglinks(反正我不會)。。。
**(vijos 95分):
#include
#include
#include
#include
using namespace std;
struct dian;
typedef int ju[11][11];
ju a,uf,uh,ul;
dian d[100];
int i,j,ans=0,h,l,sum=0,f[10],hang[10],lie[10];
int cul(ju a)
void dfs(dian k,int dd)
//printf("%d ",dd);
int h=(k.x-1)/3,l=(k.y-1)/3;
for (int i=1;i<=9;i++) }
}bool cmp(dian a,dian b)
hang[i]++;lie[j]++;f[h*3+l+1]++;
uf[h*3+l+1][a[i][j]]=1;
uh[i][a[i][j]]=1;
ul[j][a[i][j]]=1;
}int hh,ll;
for (i=1;i<=sum;i++)
sort(d+1,d+1+sum,cmp);
dfs(d[sum],sum);
if (ans!=0) cout<
noip2009 靶形數獨 (搜尋)
1755靶形數獨 accepted 標籤 搜尋 noip提高組2009 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形...
NOIP2009 靶形數獨(搜尋)
小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高的大九宮格中有 9 個 ...
NOIP2009 靶形數獨
爆搜沒什麼好說的。剪枝思路 一開始將每個點可能取的值的數量統計出,排序,從小到大搜 然後貪心可行性 就是剩下的地方都填9,得分10 不過在vj上測85。日。加了卡時,2e7次之內跳出,總算過了。include include include include include include inclu...