์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ๋ต ๋น์จ |
2 ์ด | 512 MB | 54.624% |
14502๋ฒ: ์ฐ๊ตฌ์
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค. ์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ N×M์ธ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ง์ฌ๊ฐํ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค. ์ผ๋ถ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ๋ชจ๋ ํผ์ ธ๋๊ฐ ์ ์๋ค.
www.acmicpc.net
๋ฌธ์
0 : ๋น ์นธ 1 : ๋ฒฝ 2 : ๋ฐ์ด๋ฌ์ค
๋ก ๋ํ๋ด๋ฉฐ, ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ ๋๊ฐ๋ ๊ฒ์ ๋ง๊ธฐ์ํด ๋ฐ๋์ 3๊ฐ์ ๋ฒฝ์ ์ธ์์ผ ํ๋ค.
์ด ๋ 0์ธ ๋ถ๋ถ์ ์์ ์์ญ์ด๋ผํ๊ณ ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ฒ์ ์์ด๋์ด๋ 2๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฒฝ์ ํ๋์ฉ ์ธ์๋ณผ๊น ํ๋ค๊ฐ ์ด์จ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋ค ๋ด์ผํ๋ฏ๋ก 0 ์ธ ์นธ๋ค์ ๋ชจ๋ ํ์ํ์ฌ ๋ฒฝ์ ์ธ์ฐ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
3 ≤ n, m ≤ 8
ํด๊ฒฐ
key point, ๋ธ๋ฃจํธ ํฌ์ค๋ก ๋ฒฝ์ ์ธ์ธ ์ ์๋ ๋ชจ๋ ๊ณณ์ ๋ฒฝ์ ์ธ์๋ ํ BFS๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆฐ๋ค.
- ๋ฐ์ด๋ฌ์ค ์์น๋ฅผ virus ํ์ ์ ์ฅํ๋ค.
- ๋ฐ๋์ ๋ฒฝ์ 3๊ฐ ์ธ์์ผ ํ๋ฏ๋ก lab( cnt, r, c ) ํจ์๋ฅผ ํตํด ๋ฒฝ 3๊ฐ๋ฅผ ์ธ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ์กฐ์ฌํ๋ค.
- ์๋ ๋ฐฐ์ด์์ 0์ธ ๊ณณ์๋ง ๋ฒฝ์ ์ธ์ธ ์ ์๋ค. lab(cnt-1, nr, nc)
- ์๋ ๋ฐฐ์ด์์ 0์ธ ๊ณณ์๋ ๋ฒฝ์ ์ธ์ธ ์ ์๊ธฐ๋ํ๊ณ ์์ธ์ธ ์๋ ์๋ค. lab(cnt, nr, nc)
- cnt๊ฐ 0์ผ ๋ ๋ฒฝ์ ์ธ๊ฐ ๋ชจ๋ ์ธ์ ์ผ๋ฏ๋ก ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํธ๋ฆฐ๋ค → BFS
- ๋ฐ์ด๋ฌ์ค๊ฐ ๋ชจ๋ ํผ์ง ํ 0์ ๊ฐ์๋ฅผ ์ธ์ ans ์ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ผ๋ก ๊ฐฑ์ ์ํจ๋ค.
๋ฒฝ 3๊ฐ๋ฅผ ์ธ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด์ ํ์ํ ํ ์ต์ข ์ ์ผ๋ก ๊ฐ๊ฒ ๋๋ ans๋ ์ต์ ์ด ๋ต์ด ๋๋ค.
ํด๊ฒฐ์ ๋์๋ testcase
3 4
0 2 1 0
0 1 1 2
0 0 1 0
3 4
Y 2 X Y
0 X X 2
0 0 X Y
์ถ๋ ฅ: 3
if (r >= n) return;
ํ์ฌ 36๋ฒ์งธ ์ค์ ์๋ ๋ฌธ์ฅ์ด
labํจ์ ๋งจ ์(9๋ฒ์งธ ์ค)์ ์์นํ๊ณ ์์ด์ ์์ ๋ฅผ ์คํ์ํค๋ฉด ๋ต์ด 2๊ฐ ์ถ๋ ฅ๋์๋ค.
์์๋ฅผ ๋ฐ๊พธ๋ ํด๊ฒฐ.
์ฝ๋
๋ฉ๋ชจ๋ฆฌ | ์๊ฐ |
1984 KB | 44 ms |
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
|
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
typedef pair<int, int> p;
queue<p> virus;
int n, m, arr[10][10], dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0 }, chk[10][10], ans;
void lab(int cnt, int r, int c) {
if (cnt == 0) {
queue<p> vir = virus;
// BFS ์งํ
while (!vir.empty()) {
p front = vir.front();
int x = front.first, y = front.second;
chk[x][y] = 1;
vir.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k], ny = y + dy[k];
if (nx < 0 || ny < 0 || nx >= n || ny >= m || arr[nx][ny] > 0 || chk[nx][ny]) continue;
chk[nx][ny] = 1;
vir.push({ nx, ny });
}
}
// 0๊ฐ์ ์ธ๊ธฐ
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr[i][j] == 0 && chk[i][j] == 0) cnt++;
}
}
// ans ๊ฐฑ์
ans = cnt > ans ? cnt : ans;
memset(chk, 0, sizeof(chk));
return;
}
if (r >= n) return;
int nr = c + 1 >= m ? r + 1 : r;
int nc = c + 1 >= m ? 0 : c + 1;
if (arr[r][c] == 0) {
arr[r][c] = 1;
lab(cnt - 1, nr, nc);
arr[r][c] = 0;
}
lab(cnt, nr, nc);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &arr[i][j]);
if (arr[i][j] == 2) virus.push({ i,j });
}
}
lab(3, 0, 0);
printf("%d", ans);
return 0;
}
|
cs |
'๐ฅ PS(Problem Solving) ๐ฅ > nํ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] #1012 ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2020.05.03 |
---|---|
[BOJ] #1158 ์์ธํธ์ค ๋ฌธ์ (0) | 2020.05.02 |
๋๊ธ