結果
| 問題 |
No.157 2つの空洞
|
| コンテスト | |
| ユーザー |
utouto97
|
| 提出日時 | 2019-03-21 22:52:26 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 1,689 bytes |
| コンパイル時間 | 1,843 ms |
| コンパイル使用メモリ | 163,824 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-19 02:04:44 |
| 合計ジャッジ時間 | 2,461 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define repi(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define all(x) (x).begin(),(x).end()
#define pb push_back
#define mp make_pair
#define mt make_tuple
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
const int inf = 1LL<<60;
const int mod = 1e9 + 7;
const double eps = 1e-9;
/*{
}*/
class UnionFind
{
public:
int n;
vector<int> par, rnk;
UnionFind(int n_)
{
n = n_;
par.resize(n);
rnk.resize(n);
for(int i = 0; i < n; i++){
par[i] = i;
rnk[i] = 0;
}
}
int find(int x)
{
if(par[x] == x) return x;
return par[x] = find(par[x]);
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
if(x == y) return;
if(rnk[x] < rnk[y]){
par[x] = y;
}else{
par[y] = x;
if(rnk[x] == rnk[y]) rnk[x]++;
}
}
bool same(int x, int y)
{
return find(x) == find(y);
}
};
signed main()
{
int w, h;
cin >> w >> h;
string s[h];
rep(i, h) cin >> s[i];
UnionFind uf(h*w);
rep(y, h) rep(x, w){
if(s[y][x] == '.'){
if(x+1 < w and s[y][x+1] == '.') uf.unite(y*w+x, y*w+x+1);
if(y+1 < h and s[y+1][x] == '.') uf.unite(y*w+x, (y+1)*w+x);
}
}
int ans = inf;
rep(y1, h) rep(x1, w) rep(y2, h) rep(x2, w){
if(s[y1][x1] != '.' or s[y2][x2] != '.') continue;
if(!uf.same(y1*w+x1, y2*w+x2)){
int dist = max(0LL, abs(x1-x2) + abs(y1-y2)-1);
if(ans > dist){
// printf("%lld %lld %lld %lld\n", y1, x1, y2, x2);
}
ans = min(ans, dist);
}
}
cout << ans << endl;
return 0;
}
utouto97