百练/2018ビッグデータ研究センターサマーキャンプ上机试験C:迷宫から脱出
テーマの出所:http://bailian.openjudge.cn/dsj2018xly/C
C:迷宮から逃げる
合計時間制限: 1000ms メモリの制限: 65536kB
説明
あなたは地下の迷宮の中で宝を見つけましたが、迷宮機関をトリガーし、迷宮がT分後に崩壊することになります.そのため、T分以内に迷宮を脱出する必要があります.迷宮から脱出できるかどうか知りたいです.迷宮は辺長mの正方形で、「S」はあなたの位置を表し、「E」は迷宮出口を表し、「.」は自由に歩くことができるエリアで、「#」は通り抜けられない壁で、毎回1分かけてエリア間を移動することができます(上下左右4方向).
入力
入力には複数の配列が含まれ、最初の行は整数K(1<=K<=10)であり、K群データがあることを示す.次に各配列は整数m(2<=m<=10)と整数Tを含み、mは正方形迷路の辺長を表し、Tは崩壊時間を表す.その後、m*mの文字行列であり、文字「S」、「E」、「.」、「#」を含む.
しゅつりょく
各グループのデータは1行ずつ出力され、「YES」または「NO」が出力され、崩壊前に脱出できるか(すなわち、移動回数がTを超えないか)を示す.
サンプル入力
サンプル出力
--------------------------------------------------------------
構想
権限を持たない最短ルートを広く捜索する
-----------------------------------------------------
コード#コード#
C:迷宮から逃げる
合計時間制限: 1000ms メモリの制限: 65536kB
説明
あなたは地下の迷宮の中で宝を見つけましたが、迷宮機関をトリガーし、迷宮がT分後に崩壊することになります.そのため、T分以内に迷宮を脱出する必要があります.迷宮から脱出できるかどうか知りたいです.迷宮は辺長mの正方形で、「S」はあなたの位置を表し、「E」は迷宮出口を表し、「.」は自由に歩くことができるエリアで、「#」は通り抜けられない壁で、毎回1分かけてエリア間を移動することができます(上下左右4方向).
入力
入力には複数の配列が含まれ、最初の行は整数K(1<=K<=10)であり、K群データがあることを示す.次に各配列は整数m(2<=m<=10)と整数Tを含み、mは正方形迷路の辺長を表し、Tは崩壊時間を表す.その後、m*mの文字行列であり、文字「S」、「E」、「.」、「#」を含む.
しゅつりょく
各グループのデータは1行ずつ出力され、「YES」または「NO」が出力され、崩壊前に脱出できるか(すなわち、移動回数がTを超えないか)を示す.
サンプル入力
2
4 7
S...
###.
.#E.
..#.
3 4
S..
..#
.#E
サンプル出力
YES
NO
--------------------------------------------------------------
構想
権限を持たない最短ルートを広く捜索する
-----------------------------------------------------
コード#コード#
#include
#include
#include
using namespace std;
struct node {
int x,y;
int tcnt;
node(void) {}
node(int xx, int yy, int tt): x(xx), y(yy), tcnt(tt){}
};
int m,t;
char mat[12][12] = {};
int bfs(int x0, int y0, int x1, int y1)
{
if (x0==x1 && y0==y1)
{
return 0;
}
node nd(x0, y0, 0);
int x,y;
queue q;
q.push(nd);
while (!q.empty())
{
nd = q.front();
q.pop();
x = nd.x;
y = nd.y;
if (x0)
{
if (mat[x-1][y]=='E')
{
return nd.tcnt+1;
}
else if (mat[x-1][y]=='.')
{
q.push(node(x-1,y,nd.tcnt+1));
mat[x-1][y] = '*';
}
}
if (y0)
{
if (mat[x][y-1]=='E')
{
return nd.tcnt+1;
}
else if (mat[x][y-1]=='.')
{
q.push(node(x,y-1,nd.tcnt+1));
mat[x][y-1] = '*';
}
}
}
return -1;
}
int main()
{
#ifndef ONLINE_JUDGE
ifstream fin ("C.txt");
int k,i,j,x0,y0,x1,y1,ans;
fin >> k;
while (k--)
{
fin >> m >> t;
for (i=0; i> mat[i][j];
if (mat[i][j]=='S')
{
x0 = i;
y0 = j;
}
else if (mat[i][j]=='E')
{
x1 = i;
y1 = j;
}
}
}
ans = bfs(x0,y0,x1,y1);
if (ans <= t && ans >= 0)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
fin.close();
#endif
#ifdef ONLINE_JUDGE
int k,i,j,x0,y0,x1,y1,ans;
cin >> k;
while (k--)
{
cin >> m >> t;
for (i=0; i> mat[i][j];
if (mat[i][j]=='S')
{
x0 = i;
y0 = j;
}
else if (mat[i][j]=='E')
{
x1 = i;
y1 = j;
}
}
}
ans = bfs(x0,y0,x1,y1);
if (ans <= t && ans >= 0)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
#endif
}