マルチフィールド補正第HDU 1009(hdu6665)ひょうたんと家主計算幾何学/ DFS

質問の意味:

与えられた2つの長方形は、二つの長方形平面の出力は、多くの部分に分割されています。

ソリューション:

道路は偉大な議論幾何コンピューティングされて、そして私の人生と書かれたBFSによるかもしれません。

離散エッジエッジは、次に、暴力BFSは数缶の合計を計算し、空いているにも丸で囲まれた、グリッドを空にするミドルノートと一致しません。

それは2つの点は、625種類の合計との間の長方形の、二つの長方形の関係を定義し、関係の25種類があるいかなる暴力、観察チャートの下で、点と矩形ならないないように方法がありません

それはBFSを助けるために持っていたかのように、テーブルについては、どのように再生します。

 

書式#include <iostreamの> 
の#include <キュー> 
の#include <アルゴリズム>  
書式#include <CStringの>
 使用して 名前空間はstd;
INT MAPP [ 11 ] [ 11 ]。
INT X [ 5 ]、Y [ 5 ]。
const  int型 changex [ 4 ] = { 001、 - 1 }。
const  int型 changey [ 4 ] = { 1、 - 100 }。
無効 LSH(INT * A){
     int型 B [ 5 ]。
    ブールフラグ[ 5 ] = {}; 
    B [ 1 ] = [ 1 ]、[B 2 ] [= 2 B [;] 3 ] [= 3 ]; B [ 4 ] = [ 4 ]。
    ソート(B + 1、B + 5 )。
    int型 L =一意(B + 1、B + 5)-B- 1 以下のためにint型 i = 1 ; iは= Lを<; iは++ ){
         INTの J = 1 ; J <= 4 ; J ++ ){
             場合([J] == B [i]は&&フラグ[J] == 0 ){ 
                [J] = 2 * I。
                フラグ[J] = 1 
            } 
        } 
    } 
    を返します
} 
INT ()を解決{
     INT ANS = 0 
    memset(MAPP、0はsizeof MAPP)。
//     のprintf( "%D%D%D%D \ n"は、X [1]、Y [1]、X [2]、Y [2])。
//     のprintf( "B:%D%D%D%D \ n"は、X [3]、Y [3]、X [4]、Y [4])。
    以下のためにint型 i = 1 ; iは<= 10 ; I ++ ){
         ためのint型 J = 1 ; J <= 10 ; J ++ ){
             もし、((I == X [ 1 ] || I == X [ 2 ]) && J> = Y [ 1 ] && J <= Y [ 2 ]){ 
                MAPP [I] [J] = - 1 
            } 
            もし、((jは== yを[ 1 ] || jは==をY [ 2 ])&& I> = X [ 1 ] && iが<= xの[ 2 ]){ 
                MAPP [I] [J] = - 1
            } 
            もし、((I == X [ 3 ] || I == X [ 4 ])&& J> = Y [ 3 ] && J <= Y [ 4 ]){ 
                MAPP [I] [J] = - 1 
            } 
            場合((J == Y [ 3 ] || J == Y [ 4 ])&& iが> = X [ 3 ] && iが[= xを< 4 {])
                MAPP [I] [J] = - 1 
            } 
        } 
    } 
    
//     ため(; iは= 10 <; I = 1 int型私は++){
 //             ため(INT J = 1; jは<= 10; J ++){
 //                 のprintf( "%のC"、MAPP [I] [J] == - 1 '*':?
//             }
 //             のprintf( "の\ n");
//         } 
 //     
    キュー< 整数 > QX、QY。
    以下のためにint型 i = 1 ; iは<= 10 ; I ++ ){
         ためのint型 J = 1 ; J <= 10 ; J ++ ){
             場合(MAPP [I] [J] == 0 ){ 
                ANS ++ 
                MAPP [I] [J] = ANS。
                qx.push(I); 
                qy.push(J)。
            }
            しばらく(!qx.empty()){
                 int型 XX = qx.front();
                INT YY = qy.front()。
                qx.pop();()をqy.pop。
//                 printfの( "%D%D:"、XX、YY)。
                int型のk = 0 ; K < 4 ; kは++ ){
                     int型 XXX = XX + changex [K]。
                    INT YYY = YY + changey [K]。
//                     のprintf( "%d個の%のD"、XXX、YYY)。
                    もし(XXX> = 1つの && XXX <= 10 && YYY> = 1 && YYY <&& MAPP [XXX] [YYY] == 0 ){ 
                        qx.push(XXX)。
                        qy.push(YYY)。
                        MAPP [XXX] [YYY] = ANS。
                    } 
                } 
//                 のprintf( "の\ n"); 
            }
 //             {ための式(I ++; iは= 10 <I = 1 INT)
 //             のための(INT J = 1; J <= 10; J ++){
 //                 のprintf( "%のC"、MAPPを[I] [Jを] == - 1 '*':?MAPP [I] [J] '0' +);
//             }
 //             のprintf( "の\ n");
//         } 
        } 
    } 
    戻りANS;
INT のmain(){ 
    
    int型のT。
    scanf関数(" %のD "、&T)。
    一方、(t-- ){ 
        scanf関数(" %D%D%D%D "、およびX [ 1 ]、&Y [ 1 ]、・X [ 2 ]、&Y [ 2 ])。
        scanf関数(" %D%D%D%D "、およびX [ 3 ]、&Y [ 3 ]、・X [ 4 ]、&Y [ 4 ])。
        LSH(x)は、LSH(Y)。
        printf(" %d個の\ n " 、解決())。
//        以下のために(INT I = 1; I ++; iは= 10 <){
 //             ため(INT J = 1; J <= 10; J ++){
 //                 のprintf( "%のC"、MAPP [I] [J] ==を?-1 '*':MAPP [I] [J] +) '0';
//             }
 //             のprintf( "の\ n");
//         } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/isakovsky/p/11354391.html