BOJ 1941 :: 소문난 칠공주
문제 링크 : https://www.acmicpc.net/problem/1941
나의풀이
나중에 보니.. 문제 푸신 다른 분들에 비해 과정을 두배로 하여서 시간이 오래 걸린당..ㅎ.ㅎ
5*5의 여학생반에서 7개를 선택할 수 있는 경우를 모두 탐색하여 연결되어있고 S가 4개 이상일 때에 답을 갱신한다.
나의 코드
Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1941/BOJ_1941.cpp
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 107 | // 백준알고리즘 1841번 :: 소문난 칠공주 #include<iostream> #include<vector> #include<queue> #include<string> using namespace std; #define MAX 5 int ans; char map[MAX][MAX]; int visited[MAX][MAX]; vector<pair<int, int>>v; int dx[4] = { -1,1,0,0 }; int dy[4] = { 0,0,-1,1 }; void bfs(int standard) { queue <pair<int, int>> q; int lvisited[MAX][MAX] = { 0 }; int x = v[standard].first; int y = v[standard].second; lvisited[x][y] = 1; q.push(make_pair(x,y)); int num = 1; int snum = 0; if (map[x][y] == 'S') snum++; while (!q.empty()) { int qsz = q.size(); while (qsz--) { int qx = q.front().first; int qy = q.front().second; q.pop(); for (int i = 0; i < 4; i++) { int mx = qx + dx[i]; int my = qy + dy[i]; if (mx < 0 || mx >= MAX || my < 0 || my >= MAX) continue; if (visited[mx][my] == 0 || lvisited[mx][my] == 1) continue; if (map[mx][my] == 'S') snum++; lvisited[mx][my] = 1; q.push(make_pair(mx, my)); num++; } } } if (num == 7 && snum >= 4) { ans++; } return; } // idx는 v 탐색시작 인덱스 void brute(int _idx, int _count) { // 7명을 모두 체크하였으면 확인 // 7명이 연결되지 않았으면 fail // S가 4이상이 아니면 fail // 7명이 모두 연결되었고 S가 4이상이면 ans++ if (_count == 7) { bfs(_idx - 1); return; } for (int i = _idx; i < MAX*MAX; i++) { int x = v[i].first; int y = v[i].second; visited[x][y] = 1; brute(i + 1, _count+1); visited[x][y] = 0; } } int main(void) { string str; for (int i = 0; i < MAX; i++) { cin >> str; for (int j = 0; j < MAX; j++) { map[i][j] = str[j]; v.push_back(make_pair(i, j)); } } for (int i = 0; i < MAX*MAX - 6; i++) { int x = v[i].first; int y = v[i].second; visited[x][y] = 1; brute(i + 1, 1); visited[x][y] = 0; } cout << ans; return 0; } | cs |
'Problem > Brute force' 카테고리의 다른 글
[C/C++] BOJ 3085 :: 사탕 게임 (0) | 2019.03.26 |
---|---|
[SW Expert Academy] 1767. 프로세서 연결하기 (1) | 2019.03.07 |
[C/C++] BOJ 3/2 코딩테스트 대비 모의고사 A번 - 계란으로 계란치기 (0) | 2019.03.02 |
[SW Expert Academy] 1211. Ladder2 (0) | 2019.02.26 |
[SW Expert Academy] 1209. Sum (0) | 2019.02.26 |