結果
| 問題 |
No.157 2つの空洞
|
| コンテスト | |
| ユーザー |
omu
|
| 提出日時 | 2015-02-27 00:43:45 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,916 bytes |
| コンパイル時間 | 1,064 ms |
| コンパイル使用メモリ | 90,744 KB |
| 実行使用メモリ | 633,052 KB |
| 最終ジャッジ日時 | 2024-06-23 21:57:39 |
| 合計ジャッジ時間 | 4,733 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 10 MLE * 1 -- * 5 |
ソースコード
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <functional>
#include <queue>
#include <stack>
#include <cmath>
#include <iomanip>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define CLR(a) memset((a), 0 ,sizeof(a))
#define MCLR(a) memset((a), -1 ,sizeof(a))
//遷移数
const int TMAX = 4;
//遷移変数
int dx[TMAX][2] = {{ 1, 0},
{-1, 0},
{ 0, 1},
{ 0,-1},};
int w,h;
char c[21][21];
bool f[21][21];//フラグ CLR(f);
int bfs(int i,int j)
{
if(i < 0 || j < 0 || i >= h || j >= w || f[i][j])return 0;
f[i][j] = true;
queue<pair<int,int>> q;
q.push( pair<int,int>(i,j) );
while(!q.empty())
{
pair<int,int> now = q.front();q.pop();
f[now.first][now.second] = true;
if(c[now.first][now.second] == 'b')
{
return abs(now.first-i)+abs(now.second-j)-1;
}
for(int k = 0;k < 4;k++)
{
int x = now.first+dx[k][0],y = now.second+dx[k][1];
if((x >= 0 && y >= 0 && x < h && y < w && !f[x][y]))
{
q.push(pair<int,int>(x,y));
}
}
}
return 99999999;
}
int dfs(int i,int j,char ma)
{
if(i < 0 || j < 0 || i >= h || j >= w || f[i][j])return 0;
f[i][j] = true;
if(c[i][j] == '#')return 0;
if(c[i][j] == '.')
{
for(int k = 0;k < 4;k++)
dfs(i+dx[k][0],j+dx[k][1],ma);
c[i][j] = ma;
return 1;
}
return 0;
}
void cast(char ma)
{
for(int i = 0;i < h;i++)
for(int j = 0;j < w;j++)
{
if(dfs(i,j,ma))return;
}
}
int main()
{
cin >> w >> h;
for(int i = 0;i < h;i++)
for(int j = 0;j < w;j++)
cin >> c[i][j];
CLR(f);
cast('a');
cast('b');
int anser = 99999999;
for(int i = 0;i < h;i++)
for(int j = 0;j < w;j++)
{
CLR(f);
if(c[i][j] == 'a')
{
anser = min(bfs(i,j),anser);
}
}
cout << anser << endl;
return 0;
}
omu