問題描述
蒜頭君天資聰穎,酷愛數學,尤其擅長做數獨遊戲。不過普通的數獨遊戲已經滿足不了蒜頭君了,於是他發明了一種「金字塔數獨」:
下圖即為金字塔數獨。和普通數獨一樣,在 9 × 9 的大九宮格中有 9 個 3 ×3 的小九宮格(用粗黑色線隔開的)。要求每個格仔上都有乙個 1 到 9 的數字,每個數字在每個小九宮格內不能重複出現,每個數字在每行、每列也不能重複出現。
但金字塔數獨的每乙個格仔都有乙個分值,類似金字塔的俯檢視。如圖所示,白色格仔為 6 分,藍色格仔為 7 分,綠色格仔為 8 分,紫色格仔為 9 分,紅色格仔為 10 分。顏色相同的格仔分值一樣,離中心越近則分值越高。
金字塔數獨的總分等於每個格仔上的數字和對應的分值乘積之和。現在蒜頭君給定金字塔數獨的若干數字,請問如何填寫,可以使得金字塔數獨的總分最高。
輸入格式
輸入一共 9 行。每行輸入 9 個整數(每個數都在 0—9 的範圍內),每兩個整數之間用乙個空格隔開,「0」表示該格仔為空。
輸出格式
輸出為一行,輸出乙個整數,代表金字塔數獨的最高總分。如果數獨無解,則輸出 −1。
樣例輸入
0 0 0 0 0 0 0 0 0
0 0 3 0 0 0 9 0 0
7 9 0 0 0 2 0 1 3
0 0 9 1 5 0 0 0 0
0 7 4 0 2 6 1 3 9
0 0 6 0 0 0 0 0 0
6 0 0 0 0 7 0 0 0
3 1 0 4 0 5 7 9 6
0 0 7 0 0 1 0 4 0
樣例輸出
2864
思路:本題主要問題是乙個限界以及剪枝,當位置已經有數字時則換下乙個位置,當某個數字已經被行或列或九宮格內使用時則換下乙個數字,如果沒有能填入的數字,則回溯,設定三個陣列;分別表示行列標記,l[i][k],i表示行數,k表示數字,如果已經有了則將其置為1,列同理,特別一提的是九宮格,將其劃分為九個區域,每塊的通式為(i-1)/3*3+(j-1)/3+1;可隨便帶入嘗試。
ac**`
#include
using
namespace std;
int p[10]
[10];
int l[10]
[10];
//行標記
int c[10]
[10];
//列標記
int pi[10]
[10];
//塊標記
int maxn;
int sum1;
intscore
(int i,
int j)
void
dfs(
int step,
int sum)
for(
int i=
9;i>=
1;i--
) printf("\n");
}*/// printf("step:%d\n",step);
dfs(step,sum+
score
(i,j)
*k);
p[i]
[j]=0;
step--
; l[i]
[k]=0;
c[j]
[k]=0;
pi[z]
[k]=0;
}}return;}
}return;}
intmain()
}}sum1=
81-s1;
dfs(
0,num);if
(maxn==0)
printf
("-1\n");
else
printf
("%d\n"
,maxn)
;return0;
}
注意一下起始的值需要計算一下在帶入函式。 計蒜客 漢諾塔
漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著 64 片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。現在蒜頭君開...
計蒜客 漢諾塔 Python
漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著 6464 片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤,如圖所示...
計蒜客 取數遊戲
有如下乙個雙人遊戲 n個正整數的序列放在乙個遊戲平台上,兩人輪流從序列的兩端取數,每次有數字被乙個玩家取走後,這個數字被從序列中去掉並累加到取走該數的玩家的得分中,當數取盡時,遊戲結束。以最終得分多者為勝。編乙個執行最優策略的程式,最優策略就是使自己能得到在當前情況下最大的可能的總分的策略。你的程式...