백준 2567 색종이-2

Problem : 색종이 - 2

유형 : 구현


문제 설명

그림

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다. 색종이의 수는 100이하이며, 색종이가 도화지 밖으로 나가는 경우는 없다.

예제 입력

1
2
3
4
5
4
3 7
5 2
15 7
13 14

예제 출력

1
96

해결 전략

색종이를 붙인뒤, 색종이가 아닌 공간에서 색종이와 맞닿는 면의 개수를 구한다.

주의할 점

  • 도화지 모양에 얽매이지 말자

풀이

색종이를 붙이는 함수

도화지 모양에 신경쓰지 말고, 색종이를 붙인다.

색종이랑 맞닿는 면의 개수를 세는 함수

둘레를 세는 문제이기 때문에
빈공간에서 상하 좌우에 색종이랑 맞닿는 면의 개수를 센다.


코드

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <bits/stdc++.h>
#define MAX 101
using namespace std;
bool board[MAX][MAX];

int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
int n, answer;

void check(int i, int ii) {
	if (board[i][ii])return;
	for (int dir = 0; dir < 4; ++dir) {
		int nx = i + dir[dx];
		int ny = ii + dir[dy];
		if (nx < 0 or nx >= MAX or ny < 0 or ny >= MAX)continue;
		if (!board[nx][ny])continue;
		answer++;
	}
}

void solve() {
	for (int i = 0; i < MAX; ++i) {
		for (int ii = 0; ii < MAX; ++ii) {
			check(i, ii);
		}
	}
}

void paper_set(int nx, int ny) {
	for (int i = nx; i < nx + 10; ++i) {
		for (int ii = ny; ii < ny + 10; ++ii) {
			if (board[i][ii])continue;
			board[i][ii] = true;
		}
	}
}

void input() {
	cin >> n;

	int nx, ny;
	while (n--) {
		cin >> ny >> nx;
		paper_set(nx, ny);
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
    //freopen("input.txt", "r", stdin);

	input();
	solve();
	cout << answer;

	return 0;
}

피드백

없음