タイトル説明
多数の別個の部分が与えられ、各位置の特定の画分は、総スコアが最高スコアを求め、その画分を乗じた全ての位置で別個の値の数に等しいです。
考え
まず、直接検索は確かにTを飛び出します、我々は検索を開始するために1から貪欲より良いソリューションを必要としています。私は最初、知ら列方向検索のほとんどから、仕分けラインに再びへのすべての統計答えた後に検索を行番号を再び呼ばれる各ラインの数をカウントし、そして、優れた方法を使用していました。その上で、保守数独様々な情報に注意してください。
コード
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INT MP [ 10 ] [ 10 ]。 ブール L [ 10 ] [ 10 ]、H [ 10 ] [ 10 ]、JG [ 10 ] [ 10 ]。 int型ANS; int型 V [ 15 ] [ 15 ] = {{}、{ 0、6、6、6、6、6、6、6、6、6 }、 {0、6、7、7、7、7、7、7、7、6 }、 { 0、6、7、8、8、8、8、8、7、6 }、 { 0、6、7、8、9、9、9、8、7、6 }、 { 0、6、7、8、9、10、9、8、7、6 }、 { 0、6、7、8、9、9、9、8、7、6 }、 { 0、6、7、8、8、8、8、8、7、6 }、 { 0、6、7、7、7、7、7、7、7、6 }、 { 0、6、6、6、6、6、6、6、6、6 }}。 ブールF; 構造体ノード { int型リットル、合計。 } LL [ 20 ]。 INT CMP(ノードA、ノードB) { 戻り a.sum < b.sum。 } int型の変化(int型、int型B)を { リターン(B- 1)/ 3 +(A- 1)/ 3 * 3 + 1 。 } ボイド DFS(int型のx、int型の Y、INT HA) { 場合(HA == 10 ) { F = 1; int型の合計= 0 ; 以下のために(int型 i = 1 ; iは= < 9 I ++; ) のための(INT J = 1 ; J <= 9 ; J ++ ) 合計 + =融点[I] [J] * V [I] [J]。 ANS = MAX(ANS、合計)。 返します。 } 場合(Yの== 10 ) { DFS(LLの[HA + 1 ] .L、1、HA + 1 )。 返します。 } もし(!MP [X] [Y]) { ための(int型 NUM = 1 ; NUM <= 9 ; NUM ++ ) 場合!!(H [X] [NUM] && L [Y] [NUM] && JG [変更(X、Y)] [NUM]) { MP [X] [Y] = NUM; H [X] [NUM] = 1 ; L [Y] [NUM] = 1 ; JG【変更(X、Y)] [NUM] = 1 。 DFS(X、Y + 1 、HA)。 MPが[X] [Y]は = 0 ; H [X] [NUM] = 0 ; L [Y] [NUM] = 0 ; JG【変更(X、Y)] [NUM] = 0 ; } } 他 DFS(X、Y + 1 、HA)。 } int型のmain() { ため(int型 i = 1 ; iが<= 9 ; I ++ ) { int型、S = 0 。 用(INT J = 1 ; J <= 9 J ++; ) { int型。 scanf関数(" %のD "、&A )。 もし ++(!a)のよ。 融点[I] [j]は =; H [i]は[A] = 1 ; L [j]は[A] = 1 。 JG [変更(I、J)] [A] = 1 。 } LL [I] .L = I; LL [I] .SUM = S。 } ソート(LL + 1、LL + 10 、CMP)。 DFS(LL [ 1 ] .L、1、1 )。 もし(F)のprintf(" %dの" 、ANS)。 他のprintf(" -1 " ); リターン 0 ; }