結果

問題 No.157 2つの空洞
ユーザー dnishdnish
提出日時 2017-05-04 12:31:01
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 3 ms / 2,000 ms
コード長 1,041 bytes
コンパイル時間 1,788 ms
コンパイル使用メモリ 175,188 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-14 07:02:56
合計ジャッジ時間 2,670 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 16
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define REP(i,n,N) for(int i=(n);i<(int)N;i++)
#define p(s) cout<<(s)<<endl
#define ck(n,a,b) ((a)<=(n)&&(n)<(b))
#define F first
#define S second
using namespace std;
const int inf=1e9;

int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
bool visit[20][20];
int main(){
	int w,h;
	cin>>w>>h;
	string field[21];
	REP(i,0,h) cin>>field[i];
	stack<pair<int,int>> st;
	vector<pair<int,int>> vt[2];
	int v=0;
	REP(i,1,h-1){
		REP(j,1,w-1){
			if(field[i][j]=='.'&&!visit[i][j]){
				st.push({i,j});
				vt[v].push_back({i,j});
				visit[i][j]=true;
				while(!st.empty()){
					pair<int,int> now=st.top();st.pop();
					REP(i,0,4){
						int ny=now.F+dy[i],nx=now.S+dx[i];
						if(field[ny][nx]=='#') continue;
						if(visit[ny][nx]) continue;
						visit[ny][nx]=true;
						vt[v].push_back({ny,nx});
						st.push({ny,nx});
					}
				}
				v++;
			}
		}
		if(v==2) break;
	}
	int ans=inf;
	for(auto a : vt[0]){
		for(auto b :vt[1]){
			int x= abs(b.F-a.F),y=abs(b.S-a.S);
			ans=min(ans,x+y-1);
		}
	}
	p(ans);
	return 0;
}
0