ロサンゼルスからバレーP1443
ケリーB主要駅までの仕上げは、保持している問題を解決するに _上司は、だけでなく、王紫までの主な参照を説明するために、
タイトル説明
N * Mボード(1 <N、M <= 400)は、馬はいくつかの点であり、ボード上の任意の点で起き行くためにあなたを必要とすることのために短期的に到達しました
入力形式
4つの座標データの行、基板及び馬のサイズ
出力フォーマット
mは、馬が移動するための手順の最小の点の代表到達* Nの行列(左、5ワイドグリッドは、出力が達していない-1)
サンプル入力と出力
入力:
3 3 1 1
出力:
0 3 2 3 - 1 1 2 1 4
8つの方向の動きに示すように、「日」移動への中国のチェスの馬は、位置を持っています
コードの実装:
#include <iostreamの> する#include <キュー> の#include <cstdioを> 使用して 名前空間STD; constの 整数 N = 410 ; INT N-、M、SX、SY; INTマップ[N] [N]; //は、チェッカーボードの各ポイントを保存ステップの数、並びに重み決意機能到達 INT DX [] = { 1を、1、 - 1、 - 1、2、2、 - 2 - 、 - 2 }; int型のDy [] = { 2、 - 2、2、 - 2、1 - 1、1 - 1 }; // 移動馬は8つの方向に歩くことができる / * [2]又は二次元アレイINT ddを開くために、[8] = {{1,2}、{1、-2}、{ - 1 、2}} ... DD [] [0] [] DXに等しく、ddは[] [ 1]は、 Dyを[]に等しい* / ストラクトノード{ int型、X INT Y; INT STEP; }; // 意志各点の位置およびステップの数は、ノードタイプ(構造)に充填達成するために、 INT メイン(){ CIN >> M >> N-SX >> ; SY キュー <ノード> Q; // タイプのノードを定義しますキュー Q.push((ノード){SX、SY、0 }); // 最初の地点情報がキューの先頭に圧入 / * とすることができる ノードT; TX = SX; TY = SY; t.step = 0。 Q.push(T); / * 用(INT I = 1 ; I <= N; I ++ ){ ため(INT J = 1。 ; J <= M; J ++ ) マップ[I] [J] = - 1 ; } // ステップのチェッカーボード数となっています-1ポイントを取得することができただろうが-1 地図[SX] [SY] = 0 ; // 全体の検索の初期点から始めて、ステップ数の初期ポイントが0になり ながら、(Q.empty()!) { // BFSを開始 するために(INT I = 0 ; I < 8 {; I ++)// 8は、広い検索方向 INT XX = Q.front()X +。DX [I]は、 INT。YY = Q.front()Y + Dyを[I]; IF(XX> = 1 && XX <= N - && YY> = 1 && YY <= M &&マップ[XX] [YY] == - 1)// 点に検索する場合チェス盤とは、上に見つかりません {Q.push((ノード){XX、YY、Q.front()ステップ+。1 }); // 点はキューに押し込まくる 地図[XX] [YY] Q.front =()+工程。1 ; // ステップ更新の数 } } Q.pop(); // 一方はキュー内のすべての点を移動することができ、キューの先頭の後、最初のチームは、蹴っ } ため(INT I = 1 ; I <= N; I ++){ // 出力フォーマットに従って ため INT(J = 1 ; J <= Mであり、j ++ ) のprintf(" %が-5D " 、マップ[I] [J])。 printf(" \ n個" ); } 戻り 0 。 }