洛谷 AT1350 深さ優先探索
問題の意味の翻訳
高橋生細胞は、それが格子状に分割して、長方形です。高橋さんは、高橋さんは、4つのグリッドの前と後の彼の周りのすべてのものを歩くことができます自宅から魚屋に行きたかったが、いない地区の外に、横向きに行くことができません。
今で与えられます:
s
:高橋さんの家を代表して
g
:魚屋です
.
:道路を代表して
#
:代理壁に
高橋さんは、壁を通過することはできません。
入力:各セル入力のnセルの長さと幅の(1 <= N <= 500)、M(1 <= M <= 500)代表の最初の行、次のn行毎m個の文字が記載さ格子。
出力:高橋さんは魚屋に達することができる場合は、出力「はい」、そうでない場合は「いいえ」。
サンプル入力と出力
入力#1コピー
出力#1コピー
入力#2のコピー
出力#2のコピー
入力#3のコピー
出力#3のコピー
入力#4コピー
出力#4コピー
入力#5コピー
出力#5コピー
ソリューション:
-それは、深い検索の一般的なアプリケーションとしてみなされるべきで通過するマップテンプレートのタイトルを。
このマップは、こんにゃく自身の名前から横断されます。比較的一般的な問題のクラスを代表して、同様に、行列のトラバーサルを迷路にします。運動のこのタイプは、基本的な検索を使用(深い検索をし、ちょうど同じではありません、そして最終的な目的は同じです達成全体の検索を実現)を解決することです。そして、あなたはこの問題の詳細な発想と深い検索の基本的な実装を行うことについて話すの問題に対するこの解決策。
まず、我々は理解する必要があり、検索の深さを定義する必要があります。しかし、本実施形態は、に基づいて定義され、ツリーの深さ優先トラバーサルとより容易に誰もが理解することができます。だから、少しの友人がたくさんあるはずこんにゃくモンゴルサークルのように、このようなものです:この問題はありません予定なし木々 、そして深い検索は関係がありますか?
これはパラダイムシフトが必要です:探索木の構築を。
いわゆる探索木は、木に深く抽象概念で見つかった問題を解決することはできません一見、深い検索は、ツリーの、何の深さ優先探索であると言うことではないのでしょうか?私はそれを解決するのではなく、図にこの質問を置きますか?
さて、私たちは抽象を開始しました:
上下:行くために4つのオプションがあり、各点のマップ、(すなわち、それぞれが行列座標)。だから、私たちは各ノードに抽象化することができ、図1の4つのノードを持っています。(もちろん、境界ノードと壁が除外されています)
このアイデアを使用すると、深いを検索することができます。
入力行列、開始点をマーク:考え方は以下の通りです。
出発点から深い探索は、方向及びアレイを使用して決定される、グラフを検索は、マーカーでマークされたポイントに到達することができます。
出力上のマーカーとエンドポイントはそうかどうかである場合。
コード:(小さなディテールの種類のうち:ここでは、必ずしも来るのscanfによって読まない、CINある文字は、読みます)
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=510;
int n,m;
char map[maxn][maxn];
bool v[maxn][maxn];
int dx[]={0,0,0,-1,1};
int dy[]={0,1,-1,0,0};
int a,b,c,d;
void dfs(int x,int y)
{
v[x][y]=1;
for(int i=1;i<=4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<1 || xx>n || yy<1 || yy>m || map[xx][yy]=='#' || v[xx][yy])
continue;
dfs(xx,yy);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='s')
a=i,b=j;
if(map[i][j]=='g')
c=i,d=j;
}
dfs(a,b);
if(v[c][d])
{
printf("Yes");
return 0;
}
else
{
printf("No");
return 0;
}
}