CF8Cは、注文题探し解

タイトル説明

ガールレナは、すべてが順序であるときにそれを好きで、どこにでも順番を探します。彼女は大学のための準備と部屋が混乱していたことに気づいた後は - 彼女のハンドバッグからすべてのオブジェクトを部屋について投げました。もちろん、彼女は戻って彼女のハンドバッグに入れたかったです。問題は、女の子が一度に二つ以上のオブジェクトを運ぶことができないということである、とハンドバッグを移動することはできません。彼は、オブジェクトを取った場合にも、彼女は彼女のハンドバッグを除いてどこにでも置くことができない - ための彼女の本来の意味は、彼女がそうすることはできません。

あなたはハンドバッグの座標を与えられ、いくつかのСartesian内のオブジェクトの座標は、座標系。少女は、オブジェクトの点の間の線分の長さの二乗に等しい時間内の任意の2つのオブジェクト間の距離をカバーすることが知られています。また、最初は女の子の座標とハンドバッグが同じであることが知られています。あなたは女の子が最小の時間で彼女のハンドバッグに戻ってすべてのオブジェクトを置くことができ、アクションのこのような順序を見つけることが求められます。

入力形式

入力ファイルの最初の行は、ハンドバッグの座標含ま  X_ {S}、Y_ {S} のx SをY S  。2行目は、多数含まれている  N 、Nを(  1 <= N <= 24 1 < = N < = 2 4) -女の子が持っているオブジェクトの量。次の  n個のn行は、オブジェクトの座標を含みます。すべての座標は、絶対値で100を超えてはなりません。すべての与えられた位置が異なっています。すべての数値は整数です。

出力フォーマット

最初のライン出力でのみ数 - 最小の時間少女は彼女のハンドバッグにオブジェクトを配置する必要があります。

第二ライン出力レナのための可能な最適な方法で。入力内の各オブジェクトは、そのインデックス番号(1からによって記述される  N n)は、ハンドバッグの点はパス0数で記述されて起動して、ハンドバッグの点で終わるべきです。いくつかの最適なパスがある場合、それらのいずれかを印刷します。

この質問は、圧力のような良い戦いの暴力であるが、2 ^ n個×n個^ 2複雑さは、単純に前にできませんでした。

しかし、あなたはそう、すべての操作順序が変更されたため、答えは、私の状態でこの事がありますので、この事が拾うの何時に関係なくあり、変更することは、最後のピックは確かに問題はありません入れていないだろう、それについて考えます状態のいずれかの項目のために、私は転送するためにそれを使用することができますので、私たちは、他の暴力的な列挙した項目を取り、それを一緒に選んで、対象を通過する可能性のいずれか。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
int型 N、SX、SY、X [ 30 ]、Y [ 30 ]、F [ 20000000 ]、Z [ 20000000 ]。
INT lowbit(INT X){
     戻り X& - X。
} 
INT DIS(INT U、INT V){
     リターン(X [U] -x [V])*(X [U] -x [V])+(Y [U] [V] -y)*(Y [U] - Y [V])。
} 
INT H(INT X){
     int型の CNT = 0 一方、(X){ 
        CNT ++ 
        X >> = 1 
    } 
    戻りCNT。
} 
int型のmain(){
     int型I、J。
    CIN >> X [ 0 ] >> Y [ 0 ] >> N。
    以下のための(I = 1のscanf(; iは<= N I ++)は、 " %D%D "、およびX [i]は、&Y [I])。
    memsetの(F、0x3fをはsizeof (F))。
    F [ 0 ] = 0 ;
    INTの状態= 1 ;状態<(1 << n)は、状態++ ){ 
        I= lowbit(状態)。 
        INT W = 状態。
        一方、{(W)
            J = lowbit(W)。
            INT NW = F [状態^(I | J)] + DIS(0、H(I))+ DIS(H(I)、H(J))+ DIS(H(j)は、0 );
            もし(NW < F [状態]){ 
                F [状態] = NW。
                Z [状態] =状態^(I | J)。
            } 
            W - = lowbit(W)。
        } 
    } 
    COUT << [(F 1 << N) - 1 ] << ENDL。
    int型PD =(1個の << N) - 1 一方(PD){ 
        のprintf(" 0 " )。
        INT T1 = PD ^ Z [PD]。
        INT T2 = lowbit(PD)。
        T1 - = T2。
        printf(" %dの" 、H(lowbit(T2)))。
        もし(T1)のprintf(" %dの" 、H(lowbit(T1)))。
        PD = Z [PD]。
    } 
    のprintf(" 0 \ n " );
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/zbsakioi/p/11331946.html