AtCoder ABC 092 D번 Grid Components

문제 링크

  • https://atcoder.jp/contests/abc092/tasks/arc093_b

문제 출처

  • AtCoder ABC 092 D번
  • AtCoder ARC 093 B번

풀이

$100 * 100$격자에서 문제를 항상 해결할 수 있습니다. (아래에 나와있는 전체 코드에서는 $200*200$로 구현했지만 상관 없습니다.)

먼저 100개의 행 중에서 위에 있는 50개는 검은색, 아래 50개는 흰색으로 다 칠해봅시다. 지금 우리는 1개의 검은색 컴포넌트와 1개의 흰색 컴포넌트를 갖고 있습니다.
이제 $A-1$개의 흰색 컴포넌트와 $B-1$개의 검은색 컴포넌트를 새로 만들면 됩니다.

검은색으로 칠해진 위쪽 49개의 행에서 $A-1$개의 칸을 적당히 골라서 흰색으로, 흰색으로 칠해진 아래쪽 49개의 행에서 $B-1$개의 칸을 적당히 골라서 검은색으로 칠해주면 됩니다.

전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<bits/stdc++.h>
using namespace std;

int arr[222][222];

int main(){
	//freopen("out", "w", stdout);
	int a, b; cin >> a >> b;
	if(!a){
		printf("1 1\nW\n");
		return 0;
	}
	if(!b){
		printf("1 1\nB\n");
		return 0;
	}
	printf("200 200\n");
	for(int i=1; i<=200; i++){
		for(int j=1; j<=200; j++){
			if(i <= 100) arr[i][j] = 0;
			else arr[i][j] = 1;
		}
	}
	a--, b--;
	for(int i=1; i<=100 && b; i+=2){
		for(int j=1; j<=200 && b; j+=2) arr[i][j] = 1, b--;
	}
	for(int i=1; i<=100 && a; i+=2){
		for(int j=1; j<=200 && a; j+=2) arr[201-i][j] = 0, a--;
	}
	for(int i=1; i<=200; i++){
		for(int j=1; j<=200; j++){
			if(arr[i][j]) cout << ".";
			else cout << "#";
		}
		cout << "\n";
	}
}