+全体の検索の最適化を剪定
最初のメモリを使用したい場合、答えは常に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 ] = { - 1、0、1、0 }。 CONST INT DY [ 4 ] = { 0、1、0、 - 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 ; }