問題への羅区P1126ソリューション

+全体の検索の最適化を剪定

最初のメモリを使用したい場合、答えは常に1です。

その後、真剣に広い検索することを決めました。

具体的なアイデア

STEP1の  マップの初期化は、トレリスダイヤグラム図ポイントのに変換され、この場所に注意を払う、ロボットは、添え字0かつn、mはポイントを取得することができるように含む、容積(直径1.6)を有しているからです。

STEP2  全体の検索。

STEP3  出力答え。

実装の詳細

1.変位開口アレイは、旋回動作は、対象の変化によって反映されます。

この場合の2状態判定重量だけでなく、アスペクト座標は、方向に依存します。

;障害物が先に困難である3.前方2または3が移動すると、

コードACペーストの下で

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <stdio.hに> 
する#include <アルゴリズム> 
書式#include <CStringの> 
の#include <キュー>
 使用して 名前空間をSTD。

const  int型 MAXN = 55 ;
CONST  INT DX [ 4 ] = { - 1010 }。
CONST  INT DY [ 4 ] = { 010、 - 1 }。

構造体Cノード{
     int型のX、Y、D、S。
} P。
BOOL VIS [MAXN] [MAXN] [ 4 ]。
ブールマップ[MAXN] [MAXN]。
整数N、M。
int型のSX、SY、EX、EY、SD;
キュー <Cノード> Q;

インラインボイドは、init(){
     CHAR CH。
    memsetの(マップ、はsizeof (マップ));
    scanf関数(" %D%D "、&​​N、&M)。
    ため(登録をint iは= 1 ; iが<= N; iが++ のために(登録INT J = 1 ; jは<= Mであり、j ++ ){
             int型のR。
            scanf関数(" %のD "、&R&LT);
             IF(R&LT)// 格子障害、周囲4点移動しない 
                マップを[I- 1 ] [J- 1 ] =マップ[I]、[J- 1 ]地図= [I- 1 ] [J] =マップ[I] [J] = falseに
        }
    scanf関数(" %D%D%D%D%C "、&​​SX、SY&&EX、EY&&CH)。
    もし(!マップ[SX] [SY] ||![EX] [EY] MAP){
        printf(" -1 \ N " );
        出口(0 );
    }
    CH = TOLOWER(CH)。
        もし(CH == ' N ')SD = 0 それ以外の 場合は(CH == ' E ')のsd = 1 ;
        それ以外の 場合は(CH == ' S ' SD =)2 他の SD = 3 ;
    PX = SX; PY =と; PD = SD; PS = 0 
    q.push(P)。
}

INT メイン(){
    init(); // 初期化
    int型 XX、YY、FX、FY、FD、FS; // 第九で検索における注意とMLEも変数を開くための10個のポイント
    間を(!Q.empty()){ // 広い検索 
        FX q.front =()X、q.front FY =()Y = q.front FD()D、FS = ... q.front()Sを.;
        q.pop();
        もし(FX == EX &&年度== EY){
            printf(" %D \ N- "、FS); // 直接の出力端見つける
            リターン 0 ;
        }
        もし(VIS [FX] [FY] [FD])続けます
        方法[例えば] [FY] [FD] = 
        PX = FX; PY = FY; PD =(FD + 1)%4 ; PS = FS + 1 
        q.push(P); // 右折 
        PX = FX; Pyと= FY; PD =(FD + 3)%4。 ; PS = FS + 1。;
        q.push(P); // 
        のために(レジスタint型私は= 1 ; I <= 3 {; I ++)// ステップ3ステップ1に進む 
            XX = I * FX + DX [FD]。
            YY = FY + I * DY [FD]。
            もし(XX <= 0 || XX> = N || YY <= 0!|| YY> = M ||地図[XX] [YY])ブレーク
            PX = XX; PY = YY; PD = FD; PS = FS + 1 
            q.push(P)。
        }
    }
    printf(" -1 \ N " );
    リターン 0 ;
}

 

おすすめ

転載: www.cnblogs.com/MLETNxtl/p/11809487.html