# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1238155 | matsakyannn | 축구 경기장 (IOI23_soccer) | C++20 | 0 ms | 0 KiB |
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
const int inf = 1e9;
int biggest_stadium(int N, vector <vector <int>> F){
bool okay = 1;
for(int i = 0; i < N; i++){
int st = -1;
for(int j = 0; j < N; j++){
if(!F[i][j]){
st = j; break;
}
}
if(st == -1) continue;
bool tree_on_road = 0;
for(int j = st; j < N; j++){
if(F[i][j]){
tree_on_road = 1;
continue;
}
if(tree_on_road) okay = 0;
}
}
for(int j = 0; j < N; j++){
int st = -1;
for(int i = 0; i < N; i++){
if(!F[i][j]){
st = i;
break;
}
}
if(st == -1) continue;
bool tree_on_road = 0;
for(int i = st; i < N; i++){
if(F[i][j]){
tree_on_road = 1;
continue;
}
if(tree_on_road) okay = 0;
}
}
if(okay){
int count = 0;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
count += F[i][j];
}
}
int vis_count = 0;
for(int i = 0; i < N; i++){
bool flag = 0;
for(int j = 0; j < N; j++){
if(!F[i][j]){
flag = 1;
bool visited[2005][2005] = {0};
queue <PII> q;
q.push({i, j});
while(!q.empty()){
int x = q.front().first, y = q.front().second;
//dbg(MP(x, y));
q.pop();
if(visited[x][y]) continue;
vis_count++;
visited[x][y] = 1;
for(int t = 0; t < 4; t++){
int nx = x + dx[t], ny = y + dy[t];
if(nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
if(F[nx][ny]) continue;
q.push({nx, ny});
}
}
break;
}
}
if(flag) break;
}
if(vis_count == N * N - count) return N * N - count;
}
return inf;
}