코딩 공부/백준

[백준][C++] 1941 소문난 칠공주

김 정 환 2021. 4. 19. 22:36
반응형

www.acmicpc.net/problem/1941

 

1941번: 소문난 칠공주

총 25명의 여학생들로 이루어진 여학생반은 5*5의 정사각형 격자 형태로 자리가 배치되었고, 얼마 지나지 않아 이다솜과 임도연이라는 두 학생이 두각을 나타내며 다른 학생들을 휘어잡기 시작

www.acmicpc.net

 

 

 

알고리즘 종류

완전탐색

 

 

 

사고 과정

DFS로 풀려고하니 +과 같은 교차하는 것을 확인할 수 없었습니다. BFS로 하려고 하니 재방문 확인을 할 수 없었습니다. 그래서 25개의 공간에서 7개를 선택하여 확인하는 방법을 사용하기로 했습니다.

 

1. DFS를 이용해서 조합으로 7개의 위치를 선택합니다.

 

2. 7개의 위치를 골랐다면, 이다솜파가 4명이상인지 확인합니다.

 

3. BFS로 7개의 공간이 서로 붙어있는지 확인합니다.

 

 

 

구현(C++)

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
#include <iostream>
#include <queue>
#include <cstring>
 
using namespace std;
 
int ans = 0;
 
char mat[5][5];
int g[5][5];
int isVisited[5][5];
int isSelected[26];
int dir[4][2= {{1,0}, {0,1}, {-1,0}, {0,-1}};
 
 
bool isValid(int y, int x){
    return (y>=0 && y<5&& (x>=0 && x<5);
}
 
 
// 연결되었는지 확인  
bool check(){
    
    memset(g, 0sizeof(g));
    memset(isVisited, 0sizeof(isVisited));
    
    int y, x;
    for(int i=0; i<25; i++){
        if(isSelected[i] == 0continue;
        
        y = i/5;
        x = i%5;
        
        g[y][x] = 1;
    }
    
    queue<pair<intint> > q;
    q.push({y, x});
    isVisited[y][x] = 1;
    
    int cnt = 1;
    while(!q.empty()){
        int y = q.front().first;
        int x = q.front().second;
        q.pop();
        
        for(int d=0; d<4; d++){
            int ny = y + dir[d][0];
            int nx = x + dir[d][1];
            
            if(!isValid(ny, nx)) continue;
            if(isVisited[ny][nx]) continue;
            
            if(g[ny][nx] == 1) {
                cnt++;
                q.push({ny, nx});
                isVisited[ny][nx] = 1;
            }
        }
    }
    
    if(cnt == 7return true;
    else return false;
}
 
 
// 조합  
void dfs(int idx, int total, int cnt_s){
    
    if(total == 7){
        if(cnt_s >= 4){
            if(check()) ans++;
        }
        return;
    }
    
    for(int i=idx; i<25; i++){
        if(isSelected[i]) continue;
        
        isSelected[i] = 1;
        dfs(i, total+1, cnt_s + (mat[i/5][i%5== 'S'));
        isSelected[i] = 0;
    }
}
 
 
int main(void){
 
    for(int i=0; i<5; i++){
        for(int j=0; j<5; j++){
            cin >> mat[i][j];
        }
    }
    
    dfs(000);
    cout << ans << endl;
}
cs

 

 

 

시행착오

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 18119 단어 암기  (0) 2021.04.20
[백준][C++] 1062 가르침  (0) 2021.04.19
[백준][C++] 3687 성냥개비  (0) 2021.04.19
[백준][C++] 11437 LAC(lowest Common Ancester)  (0) 2021.04.19
[백준][C++] 13308 주유소  (0) 2021.04.17