問題の本質は、おそらくまた、黄色のレベルの問題は、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、0、0)=!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(0、0、0 ); printf(" %d個の\ n " 、ANS)。 リターン 0 ; }