짱아의 개발 기록장

[SWEA] 1868. 파핑파핑 지뢰찾기(c++) / bfs 본문

Algorithm/SW Expert Academy

[SWEA] 1868. 파핑파핑 지뢰찾기(c++) / bfs

jungahshin 2020. 9. 16. 18:30
반응형

비교적? 간단한 bfs문제이다.

지뢰가 없는 곳을 방문하고 그와 인접한 8곳 중에서도 지뢰가 없다면 bfs로 방문처리를 한다.

그리고 최종적으로 방문하지 못한 곳 중 지뢰가 없는 곳을 세어주면 값을 구할 수 있다.

 

코드 첨부

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
// 1868. 파핑파핑 지뢰찾기
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
 
using namespace std;
 
int testcase, n;
string s;
char game[301][301];
int visited[301][301= {0, };
int dx[8= {00-11-11-11};
int dy[8= {-1100-111-1};
int num = 0;
 
// 주위 8칸에 모두 지뢰가 없는지 확인
bool check(int x, int y)
{
    for(int i=0; i<8; i++){
        int nx = x+dx[i];
        int ny = y+dy[i];
        if(0<=nx && nx<&& 0<=ny && ny<n){
            if(game[nx][ny]=='*'){
                return false;
            }
        }
    }
    return true;
}   
 
void play()
{
    // 주위 8칸에 지뢰가 없는 빈칸을 찾는다.
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(!visited[i][j] && game[i][j]=='.' && check(i, j)){
                num++;
                // visited[i][j] = 1;
                queue<pair<intint>> q;
                q.push(make_pair(i, j));
 
                while(!q.empty()){
                    int x = q.front().first;
                    int y = q.front().second;
                    visited[x][y] = 1;
                    q.pop();
 
                    for(int k=0; k<8; k++){
                        int nx = x+dx[k];
                        int ny = y+dy[k];
                        if(0<=nx && nx<&& 0<=ny && ny<&& !visited[nx][ny] && game[nx][ny]=='.'){
                            visited[nx][ny] = 1;
                            if(check(nx, ny)){ // 주위에 8칸에 지뢰가 없는 곳
                                q.push(make_pair(nx, ny));
                            }
                        }
                    }
                }
            }
        }
    }
}
 
int main()
{
    cin>>testcase;
    for(int i=0; i<testcase; i++){
        num = 0;
        memset(visited, 0sizeof(visited));
        cin>>n;
        for(int j=0; j<n; j++){
            cin>>s;
            for(int k=0; k<s.size(); k++){
                game[j][k] = s[k];
            }
        }
 
        play();
        for(int j=0; j<n; j++){
            for(int k=0; k<n; k++){
                if(!visited[j][k] && game[j][k]=='.'){
                    num++;
                }
            }
        }
        cout<<"#"<<i+1<<" "<<num<<"\n";
    }
}
 
cs

 

 

문제 첨부

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LwsHaD1MDFAXc

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

반응형
Comments