リンク:https://ac.nowcoder.com/acm/challenge/terminal
出典:ネットワーク牛オフ
暁明は今、ゲームをプレイしているゲームは、教示点に来て、それはN * Mの行列の迷路です。
「S」で地図上の暁明の開始点は、オープンスペースで表され、「#」で障害物を表現するために「E」と終点を示すために「」を表すために。
これは、障害物にすることはできません。(X + 1、Y)、(X-1、Y)、(X、Y:ボブは点(x、y)になった場合は、次のステップのみのいずれかに隣接する4つのグリッドを移動することができ+1)、(X、Y-1)。
暁明が知りたい、彼は今、最初から最後まで来ることができます。
説明を入力します。
このタイトルは、複数のデータセットが含まれています。
二つの数N、Mに入力されるデータの各セット
状態のマップを表すM個のシンボルの次のn行。
データ範囲:
2 <= N、M <= 500
端E.を確保しながら、出発点Sが存在することを確認
出力説明:
その後、各データ出力ライン、ボブは最初から最後まで来ることができるならば、出力はい、そうでない場合は、出力はありません
例1
輸出
コピーはい いいえ
問題解決のアイデアません:古典BFD
#pragma GCCの最適化(2) の#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 インラインint型リード(){ int型のx = 0、F = 1。チャー C = GETCHAR()。一方、(C =!' - ' &&(C < ' 0 ' || C> ' 9 '))C = GETCHAR()。もし(C == ' - ')、F = - 1、C = GETCHAR()。一方、(C> = ' 0 ' && C <= ' 9 '10 + C- ' 0 '、C = GETCHAR()。リターン F * X;} のtypedef 長い 長LL。 const int型 MAXN = 1E5 + 10 。 char型 [ 600 ] [ 600 ]。 int型 VIS [ 600 ] [ 600 ]。 構造体ノード{ int型X、Y。 }。 int型の D [ 4 ] [ 2 ] = { 0、1、0、 - 1、1、0、 -1、0 }。 int型のmain() { int型のn、mは、 一方、(scanf関数(" %D%D "!、&N、&M)= EOF){ ノードS。// 记录起点 のための(INT iは= 1 ; I <= N; I ++ ){ ため(INT J = 1 ; J <= Mであり、j ++ ){ CIN >> [I] [J]。 もし([I] [J] == ' S ' ){ Sxが = Iと、 SY= J; } } } int型フラグ=で0 ; (VIS、memsetを0、はsizeof(VIS)); // クリアタグアレイ キュー<ノード> Q; // キュー定義 q.push(S)を; // 開始点注入 一方、(!{q.empty()) ノードTEMP = q.front(); // 分析 q.pop(); // 最初のポップアップ点 IF(A [temp.x] [temp.y] == ' E ' ){ でフラグ = 1。; 休憩; } VIS [temp.x] [temp.y] = 1 。 以下のために(INT iが= 0 ; I < 4 ; I ++ ){ ノードR。 RX = temp.x + D [i]が[ 0 ]。 RY = temp.y + D [i]を[ 1 ]。 もし受信(Rx> = 1 && R.x <= N && R.y> = 1 && R.y <= M && VIS [受信] [さRy] == 0 && [受信] [さRy]!= ' #' ){ VIS [RX】 [さRy] = 1。 q.push(R&LT); // スタックアイドル決意 } } } IF(のフラグ== 1 ){ のprintf(" はい\ N- " ); } 他{ のprintf(" いいえ\ N- " ); } } 戻り 0 。 }
ACコード2。
書式#include <cstdioを> する#include <CStringの> の#include <キュー> 使用して 名前空間をSTD。 チャーマップ[ 600 ] [ 600 ]。 チャー S [ 100 ]。 BOOL VIS [ 600 ] [ 600 ]。 構造体ノード{ int型のX、Y。 }。 int型の D [ 4 ] [ 2 ] = { 0、1、0、 - 1、1、0、 - 1、0 }。 INT のmain() { int型N、M。 一方、(scanf関数(" %D%D "!、&N、&M)= EOF) { ノードS。 (複数可)を取得します。// getchar関数(); 以下のために(INT iが= 1 ; I <= N; I ++ ){ ため(INT J = 1 ; J <= M; J ++ ){ scanf関数(" %のC "、&マップを[I] [J])。 もし(マップ[I] [J] == ' S ' ){ Sxを =私; SY = J; } } (単数または複数)を取得します。 } int型フラグ= 0 。 memsetの(VIS、0、はsizeof (VIS))。 キュー <ノード> Q; (S)q.push。 一方、(!q.empty()) { ノードTEMP = q.front()。 q.pop(); もし(地図[temp.x] [temp.y] == ' E ' ) {フラグ = 1。ブレーク ;} VIS [temp.x] [temp.y] = 1 。 以下のために(INT iが= 0 ; I < 4 ; I ++ ) { ノードR。 RX = temp.x + D [i]が[ 0 ];ライ= temp.y + D [i]を[ 1 ]。 もし受信(Rx < 1 || Ryは< 1 ||のRx> N || Ryは> M)続けます。 もし(!VIS [受信] [さRy] &&マップ[受信] [さRy]!= ' #' ) { VIS [受信] [さRy] = 1。 q.push(R)。 } } } 場合(フラグ)のprintf(" はい\ n " ); 他のprintf(" ノー\ N " ); } 戻り 0 。 }