λ¬Έμ
μλ¬Έλ μΉ κ³΅μ£Ό λ¬Έμ λ°λ‘κ°κΈ°
μ΄ 25λͺ μ μ¬νμλ€λ‘ μ΄λ£¨μ΄μ§ μ¬νμλ°μ 5*5μ μ μ¬κ°ν 격μ ννλ‘ μλ¦¬κ° λ°°μΉλμκ³ , μΌλ§ μ§λμ§ μμ μ΄λ€μκ³Ό μλμ°μ΄λΌλ λ νμμ΄ λκ°μ λνλ΄λ©° λ€λ₯Έ νμλ€μ νμ΄μ‘κΈ° μμνλ€. 곧 λͺ¨λ μ¬νμμ΄ ‘μ΄λ€μν’μ ‘μλμ°ν’μ λ νλ‘ κ°λΌμ§κ² λμμΌλ©°, μΌλ§ μ§λμ§ μμ ‘μλμ°ν’κ° μΈλ ₯μ νμ₯μν€λ©° ‘μ΄λ€μν’λ₯Ό μννκΈ° μμνλ€.
μκΈ°μμμ λλ ‘μ΄λ€μν’μ νμλ€μ κ³Όκ°ν νμ¬μ 체μ λ₯Ό ν¬κΈ°νκ³ , ‘μλ¬Έλ μΉ κ³΅μ£Ό’λ₯Ό κ²°μ±νλ κ²μ΄ μ μΌν μμ‘΄ μλ¨μμ κΉ¨λ¬μλ€. ‘μλ¬Έλ μΉ κ³΅μ£Ό’λ λ€μκ³Ό κ°μ κ·μΉμ λ§μ‘±ν΄μΌ νλ€.
- μ΄λ¦μ΄ μ΄λ¦μΈ λ§νΌ, 7λͺ μ μ¬νμλ€λ‘ ꡬμ±λμ΄μΌ νλ€.
- κ°ν κ²°μλ ₯μ μν΄, 7λͺ μ μ리λ μλ‘ κ°λ‘λ μΈλ‘λ‘ λ°λμ μΈμ ν΄ μμ΄μΌ νλ€.
- νν©κ³Ό λ²μμ μν΄, λ°λμ ‘μ΄λ€μν’μ νμλ€λ‘λ§ κ΅¬μ±λ νμλ μλ€.
- κ·Έλ¬λ μμ‘΄μ μν΄, ‘μ΄λ€μν’κ° λ°λμ μ°μλ₯Ό μ ν΄μΌ νλ€. λ°λΌμ 7λͺ μ νμ μ€ ‘μ΄λ€μν’μ νμμ΄ μ μ΄λ 4λͺ μ΄μμ λ°λμ ν¬ν¨λμ΄ μμ΄μΌ νλ€.
μ¬νμλ°μ μ리 λ°°μΉλκ° μ£Όμ΄μ‘μ λ, ‘μλ¬Έλ μΉ κ³΅μ£Ό’λ₯Ό κ²°μ±ν μ μλ λͺ¨λ κ²½μ°μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
νμ΄
- dfsλ‘ κ΅¬νκΈ° => μ€κ°μ Tμ νν ꡬν μ μμ
- next_permutationμΌλ‘ ꡬνκΈ° (brute force)
μ½λ
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#define PRINCESS 7
using namespace std;
int result = 0;
char position[5][5];
int direction[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
vector<int> permuVector(25);
bool isOverFour(vector<pair<int, int>>& posArr) {
int exitNum = 0;
for (int i = 0; i < posArr.size(); i++) {
if (position[posArr[i].first][posArr[i].second] == 'Y') exitNum++;
if (exitNum > 3) return false; // λ°±νΈλνΉ
}
return true;
}
bool isAdjacent(vector<pair<int, int>>& posArr) {
// bfs
int map[5][5];
int visited[5][5];
fill(&map[0][0], &map[4][5], 0);
fill(&visited[0][0], &visited[4][5], 0);
for (int i = 0; i < posArr.size(); i++) {
map[posArr[i].first][posArr[i].second] = 1;
}
queue<pair<int, int>> que;
que.push(posArr[0]);
visited[posArr[0].first][posArr[0].second] = 1;
int count = 1;
while (!que.empty()) {
auto pos = que.front(); que.pop();
for (int i = 0; i < 4; i++) {
int row = pos.first + direction[i][0];
int col = pos.second + direction[i][1];
if (row < 0 || col < 0 || row>4 || col >4) continue;
if (map[row][col] != 1 || visited[row][col] == 1) continue;
visited[row][col] = 1;
count++;
que.push(make_pair(row, col));
if (count == 7)
return true;
}
}
return false;
}
vector<pair<int, int>> getPositionByIndex(vector<int> permu) {
vector<pair<int, int>> posArr;
for (int i = 0; i < permu.size(); i++) {
if (permu[i] == 1) {
posArr.push_back(make_pair(i / 5, i % 5));
}
}
return posArr;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 0; i < 5; i++) {
string str; cin >> str;
for (int j = 0; j < str.length(); j++) {
position[i][j] = str[j];
}
}
int num = 0;
for (int i = permuVector.size() - 1; ; i--, num++) {
if (num == PRINCESS) break;
permuVector[i] = 1;
}
int result = 0;
do {
vector<pair<int, int >> posArr = getPositionByIndex(permuVector);
if (isOverFour(posArr) && isAdjacent(posArr)) result++;
} while (next_permutation(permuVector.begin(), permuVector.end()));
cout << result;
}
κ²°κ³Ό
μμ΄λ | λ©λͺ¨λ¦¬ | μκ° |
---|---|---|
gmldms784 | 2028 | 172 |
gmldms784 | 2028 | 248 |
μκ° μ μΆλ ₯ μ΅μ νν μ½λ
'Algorithm λ¬Έμ > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[c++] BOJ 1027 :: κ³ μΈ΅ 건물 (0) | 2021.08.31 |
---|---|
[c++] BOJ 17370 :: μ‘κ°ν μ°λ¦¬ μμ κ°λ―Έ (0) | 2021.08.24 |
[c++] BOJ 18119 :: λ¨μ΄ μκΈ° (0) | 2021.08.10 |
[c++] BOJ 1062 :: κ°λ₯΄μΉ¨ (0) | 2021.08.10 |
[c++] BOJ 17244 :: μλ§λ€μ°μ° (0) | 2021.08.02 |
Comment