1868 파핑파핑 지뢰찾기


1. 지뢰를 기준으로 주변 8곳에 지뢰가 아니면 +1 해준다.


2. map[i][j] 가 0인 점들에 대해서 주변 8방향으로 탐색

-> 탐색할때 res++

-> 폭탄이면 리턴

-> 0이 아닌 숫자가 나오면 방문여부 체크 해주고 리턴

-> 0을만나면 계속해서 탐색


3. 폭탄이 아니고 방문되지 않은 점들에 대해서 카운팅


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
#include <iostream>
using namespace std;
 
int t, n, res;
int map[302][302];
bool visited[302][302];
int dx[] = { 1,1,-1,-1,0,1,0,-1 };
int dy[] = { 1,-1,1,-1,1,0,-1,0 };
 
void numbering(int x,int y) {
    for (int i = 0; i < 8; i++) {
        int ax = x + dx[i];
        int ay = y + dy[i];
        if (ax > 0 && ay > 0 && ax <= n && ay <= n && map[ax][ay] != '*') {
            map[ax][ay]++;
        }
    }
}
 
void dfs(int x,int y,bool flag) {
    visited[x][y] = true;
    if (!flag) return;
    for (int i = 0; i < 8; i++) {
        int ax = x + dx[i];
        int ay = y + dy[i];
        if (ax > 0 && ay > 0 && ax <= n && ay <= n) {
            if (map[ax][ay] == '*'continue;
            if (!visited[ax][ay]) {
                if (map[ax][ay] == 0) {
                    dfs(ax, ay, true);
                }
                else {
                    dfs(ax, ay, false);
                }
            }
        }
    }
}
 
int main() {
    scanf("%d"&t);
    for (int tc = 1; tc <= t; tc++) {
        scanf("%d",&n);
        res = 0;
        char buf[301];
        for (int i = 1; i <= n; i++) {
            scanf("%s"&buf);
            for (int j = 1; j <= n; j++) {
                map[i][j] = buf[j-1];
                if (map[i][j] == '.') map[i][j] = 0;
                visited[i][j] = false;
            }
        }
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (map[i][j] == '*') numbering(i, j);
            }
        }
 
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (!visited[i][j] && map[i][j] == 0) {
                    dfs(i, j, true);
                    res++;
                }
            }
        }
 
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (map[i][j] == '*'continue;
                if (!visited[i][j]) res++;
            }
        }
 
        printf("#%d %d\n", tc, res);
    }
}
cs


'SWEA::문제풀이' 카테고리의 다른 글

1767 프로세서 연결하기  (1) 2018.02.24
3349 최솟값으로 이동하기  (0) 2018.02.23
3282 0/1 Knapsack  (0) 2018.02.18
1949 등산로 조성  (0) 2018.02.13
2477 차량 정비소  (0) 2018.02.07

+ Recent posts