問題P1556 [パス]幸せへのソリューション

ポータル

問題の本質は、おそらくまた、黄色のレベルの問題は、DFSができ、難しいことではありません。(私はACの前に3回を提出していることを教えてくれません)

牛(DFS次)条件に到着:

図1に示すように、現在のx軸またはウシY軸座標に等しいです。

2は、到着する有効にする必要があります

図3は、されていませんでした。

最初のターンがあるかどうかを確認する方法を、第二の条件に焦点を当てて?開始点とリターン線方向上の目標点を決定することによって、本明細書の機能を使用します。

インラインINTダイアー(int型 X、INT Y、int型の X1、int型Y1は){
     // 条件1から、それだけでなく、同じ軸で決定された大小関係です。
    IF(X <X1)リターン 1。;
     IF(X> X1)リターン 2 ;
     IF <(Y1 Y)リターン 。3 IF(Y> Y1)リターン 4。; 
}

第二優先パスかどうかを決定することです。すべてのポイントは、レコードが経過したか否かを、ブール値の配列を定義します。すべてのポイントが通過しているかどうかを判断するために、DFS機能の開始時に、設立された場合、決定し、それはターンの後、原点に戻ることができるかどうかそれはまだ保持している場合、カウンタがインクリメントされます。

次のように最後のコードは次のとおりです。

書式#include <cstdioを> 
する#include <CStringの>
 使用して 名前空間はstdを、
構造体の点{ int型 X、Y;} P [ 11 ]。
int型 N、ANS = 0 ブール B [ 11 ]、C。
インラインINT悲惨(int型のx、int型 Y、INT X1、INT Y1){
     場合(X <X1)リターン 1 もし(X> X1)リターン 2 もし(Y <Y1)リターン 3 もし(Y> Y1)リターン 4 
} 
ボイド DFS(int型のx、int型の Y、int型D){ 
    C = ため(登録INT i = 0 ; iがn <; iは++ 場合(B [I]){ 
            C = 破ります; 
        } 
    もし、(C &&(Xの== 0 || Yの== 0)&&悲惨(X、Y、00)=!D){ 
        ANS ++。リターン; 
    } 
    ため(登録をint i = 0 iが++; iがN < であれば、[I] &&悲惨(X、Y((P [i]は.X == X || P [i]を.Y == Y)&& B !、P [i]は.X、P [I] .Y)= D){ 
            B [i]は = 
            DFS(P [i]の.X、P [i]は.Yを、悲惨(X、Y、P [i]は.X、P [I] .Y))。
            B [i]は = 
        } 
} 
int型のmain(){ 
    memsetの(B、はsizeof (b)参照)。
    scanf関数(" %のD "、&N)
    (レジスタint型I = 0 ; 私は、n <; I ++)のscanf(" %d個の%のD "、&​​P [i]は.X、&Pの[I] .Y)。
    DFS(000 ); 
    printf(" %d個の\ n " 、ANS)。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/mhhx/p/11634960.html