数独型標的

https://loj.ac/problem/2591

タイトル説明

  多数の別個の部分が与えられ、各位置の特定の画分は、総スコアが最高スコアを求め、その画分を乗じた全ての位置で別個の値の数に等しいです。

考え

  まず、直接検索は確かに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 ] = {{}、{ 0666666666 }、
                 {0677777776 }、
                 { 0678888876 }、
                 { 0678999876 }、
                 { 06789109876 }、
                 { 0678999876 }、
                 { 0678888876 }、
                 { 0677777776 }、
                 { 0666666666 }}。
ブール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、11 )。
    もし(F)のprintf(" %dの" 、ANS)。
    のprintf(" -1 " );
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/fangbozhen/p/11613847.html