結果
問題 | No.157 2つの空洞 |
ユーザー | cureskol |
提出日時 | 2020-04-09 11:19:45 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 2,015 bytes |
コンパイル時間 | 1,888 ms |
コンパイル使用メモリ | 180,020 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-22 07:45:16 |
合計ジャッジ時間 | 2,628 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 2 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 2 ms
6,940 KB |
testcase_08 | AC | 2 ms
6,944 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 2 ms
6,944 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 3 ms
6,944 KB |
testcase_16 | AC | 3 ms
6,940 KB |
testcase_17 | AC | 2 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,944 KB |
testcase_19 | AC | 3 ms
6,940 KB |
コンパイルメッセージ
main.cpp: In function 'int main()': main.cpp:73:22: warning: 'J' may be used uninitialized [-Wmaybe-uninitialized] 73 | if(!uf.same(i*w+j,I*w+J))continue; | ~~~~~~~^~~~~~~~~~~~~ main.cpp:49:9: note: 'J' was declared here 49 | int I,J; | ^ main.cpp:73:30: warning: 'I' may be used uninitialized [-Wmaybe-uninitialized] 73 | if(!uf.same(i*w+j,I*w+J))continue; | ~^~ main.cpp:49:7: note: 'I' was declared here 49 | int I,J; | ^
ソースコード
#include <bits/stdc++.h> using namespace std; struct UnionFind{ int num;//連結成分の数 vector<int> r,p;//そのグループのサイズ,自分の親っぽいやつ UnionFind(){} UnionFind(int n):num(n),r(n,1),p(n,0){iota(p.begin(),p.end(),0);} int find(int x){//どのグループに所属するか return (x==p[x]?x:p[x]=find(p[x]));//xがグループの名前と一致するまでxを親にする } bool same(int x,int y){//同じグループかどうか return find(x)==find(y); } void unite(int x,int y){//xとyを同じグループにする x=find(x);y=find(y);//xとyのグループの名前をどっちかが変える if(x==y) return; if(r[x]<r[y]) swap(x,y);//サイズが大きい方をxとする r[x]+=r[y];//yの親をxにする(今までyだったグループ名がxになる) p[y]=x; num--; } int size(int x){//グループの大きさ return r[find(x)]; } int count() const{//グループの数 return num; } }; int ans=1e9; int dy[4]={-1,1,0,0},dx[4]={0,0,-1,1}; typedef pair<int,int> P; queue<P> que; template<typename T> void chmin(T &a,T b){ if(a>b)a=b; } signed main(){ int w,h;cin>>w>>h; UnionFind uf(w*h); vector<string> s(h); for(int i=0;i<h;i++)cin>>s[i]; int I,J; for(int i=0;i<h;i++) for(int j=0;j<w;j++) if(s[i][j]=='.'){ que.push(P(i,j));I=i;J=j; i=j=1e9; } while(que.size()){ P p=que.front();que.pop(); int y=p.first,x=p.second; for(int i=0;i<4;i++){ int Y=dy[i]+y,X=dx[i]+x; if(s[Y][X]=='.'&&!uf.same(Y*w+X,y*w+x)){ uf.unite(Y*w+X,y*w+x); que.push(P(Y,X)); } } } for(int i=0;i<h;i++){ for(int j=0;j<w;j++){ for(int k=0;k<h;k++){ for(int l=0;l<w;l++){ if(uf.same(i*w+j,k*w+l))continue; if(s[i][j]!='.'||s[k][l]!='.')continue; if(!uf.same(i*w+j,I*w+J))continue; chmin(ans,abs(i-k)+abs(j-l)); } } } } cout<<ans-1<<endl; }