반응형
https://www.acmicpc.net/problem/18808
코테 모의고사 문제입니다.
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
//노트북의 행,열, 스티커 개수
int n, m, k;
//스티커의 행,열
int r, c;
int sticker[11][11];
int laptop[41][41];
//90도 우측으로 회전
void rotate(int sticker[11][11]) {
int tmp[11][11];
memset(tmp, 0, sizeof(tmp));
for (int i = 1; i <= c; i++) {
for (int j = 1; j <= r; j++) {
tmp[i][j] = sticker[r - j + 1][i];
}
}
memset(sticker, 0, sizeof(sticker));
for (int i = 1; i <= c; i++) {
for (int j = 1; j <= r; j++) {
sticker[i][j] = tmp[i][j];
}
}
swap(r, c);
}
//붙일수 있는가?
bool check(int laptop[41][41], int x, int y) {
int tmp[41][41];
memset(tmp, 0, sizeof(tmp));
int flag = 0;
//노트북 상태 tmp배열에 복사
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
tmp[i][j] = laptop[i][j];
}
}
for (int row = 1; row <= r; row++) {
for (int col = 1; col <= c; col++) {
//붙이려는 곳에 이미 칸이 차있거나 노트북 크기에서 벗어나면 return 0.
if ((laptop[row + x - 1][col + y - 1] && sticker[row][col]) || ( row + x - 1 > n || col + y - 1 > m )) { return 0; }
//노트북이 0이고 스티커가 1인 것만 붙임
else if (laptop[row + x - 1][col + y - 1] == 0 && sticker[row][col])
tmp[x + row - 1][y + col - 1] = sticker[row][col];
}
}
for (int row = 1; row <= n; row++) {
for (int col = 1; col <= m; col++) {
laptop[row][col] = tmp[row][col];
}
}
return 1;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int ans = 0;
cin >> n >> m >> k;
for (int i = 0; i < k; i++) {
memset(sticker, 0, sizeof(sticker));
cin >> r >> c;
for (int row = 1; row <= r; row++) {
for (int col = 1; col <= c; col++) {
cin >> sticker[row][col];
}
}
int f = 0;
for (int k = 0; k < 4; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (check(laptop, i, j)) {
f = 1;
break;
}
}
if (f) break;
}
if (f) break;
rotate(sticker);
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (laptop[i][j])
ans++;
}
}
cout << ans << '\n';
}
|
cs |
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 8979번 : 올림픽 (0) | 2020.04.17 |
---|---|
(C++) - 백준(BOJ) 2108번 : 통계학 (0) | 2020.04.07 |
(C++) - 백준(BOJ) 17174번 : 전체 계산 횟수 (0) | 2020.03.12 |
(C++) - 백준(BOJ) 18301번 : Rats 답 (1) | 2020.02.06 |
(C) - 백준(BOJ) 10889번 : Acient Symbol 답 (2) | 2020.01.21 |