小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他
們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,
z 博士拿出了他最近發明的「靶形數獨」,作為這兩個孩子比試的題目。
靶形數獨的方格同普通數獨一樣,在 9 格寬×9 格高的大九宮格中有 9 個 3 格寬×3 格
高的小九宮格(用粗黑色線隔開的)。在這個大九宮格中,有一些數字是已知的,根據這些數字,利用邏輯推理,在其他的空格上填入 1 到 9 的數字。每個數字在每個小九宮格內不能
重複出現,每個數字在每行、每列也不能重複出現。但靶形數獨有一點和普通數獨不同,即
每乙個方格都有乙個分值,而且如同乙個靶子一樣,離中心越近則分值越高。(如圖)
上圖具體的分值分布是:最裡面一格(黃色區域)為 10 分,黃色區域外面的一圈(紅
色區域)每個格仔為 9 分,再外面一圈(藍色區域)每個格仔為 8 分,藍色區域外面一圈(棕
色區域)每個格仔為 7 分,最外面一圈(白色區域)每個格仔為 6 分,如上圖所示。比賽的
要求是:每個人必須完成乙個給定的數獨(每個給定數獨可能有不同的填法),而且要爭取
更高的總分數。而這個總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字
的乘積的總和
總分數即每個方格上的分值和完成這個數獨時填在相應格上的數字
的乘積的總和。如圖,在以下的這個已經填完數字的靶形數獨遊戲中,總分數為 2829。遊戲規定,將以總分數的高低決出勝負。
由於求勝心切,小城找到了善於程式設計的你,讓你幫他求出,對於給定的靶形數獨,能
夠得到的最高分數。
輸入格式:
一共 9 行。每行 9 個整數(每個數都在 0―9 的範圍內),表示乙個尚未填滿的數獨方
格,未填的空格用「0」表示。每兩個數字之間用乙個空格隔開。
輸出格式:
輸出共 1 行。
輸出可以得到的靶形數獨的最高分數。如果這個數獨無解,則輸出整數-1。
剛開始還在糾結如何判斷每行和每列每個3x3小宮的數字重複怎麼辦。看完題解原來用乙個行的二維陣列、列的二維陣列、每個3x3小宮代表數字的的二維陣列來判重就行了。真是,怎麼沒想到吶。
然後正確思路是看沒填數字的位置上,哪些地方可選擇的方案數最少,就先從哪填。
#include#include#include#includeusing namespace std;
int sudoku[10][10];
bool row[10][10];//每行占用的數字狀態
bool column[10][10];//沒列占用的數字狀態
bool gong[10][10];//每個9小格的宮鎖占用的數字狀態
int ans;
int t = 81;
bool flag;//有解為true,無解為false
int score[10][10] =//數獨地圖的分數分布
;int ju[10][10] = //每個3x3小宮代表的數字,該數字是gong[10][10]的一維
;void dfs(int left,int now)//left是還剩多少個位置沒填,now是當前填了的分數總和
//if (now + left * 90 <= ans) return;//剪枝1。題解中說這也是乙個剪枝,但我發現去掉這個,換成下面的剪枝2會更快
//然後正確思路是看沒填數字的位置上,哪些地方可選擇的方案數最少,就先從哪填。
int mx = 0, my = 0, way = 0, mn = 10,bc = 0;
for (register int i = 1; i <= 9; i++)
if (mn == 1) break;//如果mn為1,說明這個位置可選擇的方案數是最少的(這應該算乙個剪枝吧)剪枝2
} int tc = ju[mx][my];//確定了從乙個位置填起,並得知該位置所在的3x3小宮的數字
for (register int i = 9; i >= 1; i--)
if (!row[mx][i] && !column[my][i] && !gong[tc][i]) }
int main()
} dfs(t, ans);
if (flag) cout << ans;
else cout << -1;
return 0;
}
洛谷 P1074 靶形數獨
p1074 靶形數獨 小城和小華都是熱愛數學的好學生,最近,他們不約而同地迷上了數獨遊戲,好勝的他 們想用數獨來一比高低。但普通的數獨對他們來說都過於簡單了,於是他們向 z 博士請教,z 博士拿出了他最近發明的 靶形數獨 作為這兩個孩子比試的題目。靶形數獨的方格同普通數獨一樣,在 9 格寬 9 格高...
洛谷P1074 靶形數獨
這道題單獨以每個位置遞迴純暴力搜尋的話,複雜度9 81,考慮剪枝,和八皇后類似,在同一行同一列同一宮則不能放。另外,想象解答樹,先搜尋情況少的位置和先搜尋情況多的位置總結點數是一樣的,不一樣的地方在於先搜情況少的的話,靠近樹根的分叉少,靠近枝葉稠密,若先搜情況多的,則樹根處稠密,枝葉稀疏。考慮剪枝,...
洛谷P1074 靶形數獨
description 寫乙個做數獨的程式,但是這個數獨有一點不同的是,每個格仔有乙個權值,權值與在格仔上的數字乘積之和為總分,求最大能有多少分。格仔的權值規律如下 從白色的框到 依次為6,7,8,9,10 input 數獨局面 output answer analysis 框架上就是dfs搜尋,但...