SWEA 1868. 파핑파핑 지뢰찾기
dfs
- 먼저 주변 지뢰 개수를 계산한다.
- 각 위치를 돌며 dfs를 수행한다.
- 지뢰 개수가 0이고, 아직 방문하지 않은 위치만 수행
- dfs 수행한 횟수를 카운트한다.
- 아직 방문하지 않았고, 주변의 지뢰를 0보다 더 갖고 있는 위치의 개수를 카운트한다.
- 지뢰 위치를 방문해놓은 상태로 미리 뒀어야 헀는데, 그렇게 하지 않아 푸는 시간이 지체됐었다.
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
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
using namespace std;
#define MAX_N 305
int N;
bool visited[MAX_N][MAX_N];
string board[MAX_N];
int num[MAX_N][MAX_N];
int dx[8] = { 0, -1, 0, 1, -1, -1, 1, 1};
int dy[8] = {-1, 0, 1, 0, -1, 1, -1, 1};
void init() {
memset(visited, 0, sizeof(visited));
memset(num, 0, sizeof(num));
cin >> N;
for (int i = 0; i < N; i++)
cin >> board[i];
}
void bfs(int sr, int sc) {
queue<pair<int, int> > q;
q.push(make_pair(sr, sc));
visited[sr][sc] = true;
while (!q.empty()) {
int r = q.front().first;
int c = q.front().second;
q.pop();
for (int i = 0; i < 8; i++) {
int nr = r + dx[i];
int nc = c + dy[i];
if \(nr < 0 \|| nr >= N \|| nc < 0 \|| nc >= N)
continue;
if (visited[nr][nc])
continue;
visited[nr][nc] = true;
if (num[nr][nc] == 0)
q.push(make_pair(nr, nc));
}
}
}
int solution() {
// 주변 지뢰의 개수 계산
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == '*') {
visited[i][j] = true;
continue;
}
for (int k = 0; k < 8; k++) {
int nr = i + dx[k];
int nc = j + dy[k];
if \(nr < 0 \|| nr >= N \|| nc < 0 \|| nc >= N)
continue;
if (board[nr][nc] == '*')
num[i][j]++;
}
}
}
int res = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j] && num[i][j] == 0) {
bfs(i, j);
res++;
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j] && num[i][j] != 0) {
visited[i][j] = true;
res++;
}
}
}
return res;
}
int main() {
int testcase;
cin >> testcase;
for (tc = 1; tc <= testcase; tc++) {
init();
cout << "#" << tc << " " << solution();
}
}