BFS迷路

リンク: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

エントリー

コピー
3つの3 
S .. 
..E 
... 
3 3 
S ## 
### 
## E

輸出

コピー
はい
いいえ

問題解決のアイデアません:古典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 ] = { 010、 - 110、 -10 }。
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 ] = { 010、 - 110、 - 10 }。
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 
}

 


おすすめ

転載: www.cnblogs.com/lipu123/p/12151857.html