迷路
制限時間:1秒メモリ制限:32MBの提出:31解決策:5
タイトル説明
暁明は迷路にいる、あなたはボブが、出発地から目的地までの最短距離を見つける助けてくださいます。
暁明はわずか4つの方向に移動させます。
エントリー
データの複数のセットを含むテスト入力。入力の最初の行は、整数であるTグループT-テストデータを表します。
二つの整数N及びM(1 <= N、Mのそれぞれの第1入力ライン <= 100)。
M個の入力文字の次のNラインは、各文字が小さな四角形迷路で表されます。
などの文字の意味は次のとおりです。
「S」:開始点
「E」:終了
「 - 」:オープンスペースを、で
「#」:通じ、失読症の
保証および入力データの唯一の始点と終点。
輸出
最小距離の各セットの開始から終了までの入力及び出力のために、目的地までの原点からのパスは、-1の出力が存在しない場合。
サンプル入力
1つの 5 5 S - ### ----- ## --- E#--- --- ##
サンプル出力
9
#include<iostream>
#include<queue>
using namespace std;
struct Node {
int x,y;
int cnt;
};
char map[109][109];
int m,n;
int dir[4][2] = { {0,1} ,{ 0,-1 } ,{ 1,0 } ,{ -1,0 } } ;
void bfs(int x,int y){
int f=0;
queue<struct Node> q;
struct Node s;
s.x=x;
s.y=y;
s.cnt=0;
q.push(s);
while(!q.empty()){
s = q.front();
q.pop();
for( int i=0;i<=3;i++){
int xx = s.x + dir[i][0];
int yy = s.y + dir[i][1];
if( xx >=0 && xx < m && yy >=0 && yy < n ){
if( map[xx][yy] == '-' ){
map[xx][yy] = '#';
struct Node tmp;
tmp.x = xx;
tmp.y = yy;
tmp.cnt= s.cnt+1;
q.push(tmp);
}
if( map[xx][yy] == 'E'){
printf("%d\n",s.cnt+1);
f=1;
break;
}
}
}
if( f )
break;
}
if(!f){
printf("-1\n");
}
}
int main(void){
int T;
scanf("%d",&T);
while(T--){
int x,y;
scanf("%d%d",&m,&n);
for( int i=0;i<m;i++){
scanf(" %s",map[i]);
for( int j=0;j<n;j++){
if( map[i][j] =='S'){
x=i;
y=j;
}
}
}
bfs(x,y);
}
return 0;
}