[알고리즘 + 자료구조]/[백준]
[BaekJoon/백준] 9207번 페그 솔리테어
Hevton
2022. 7. 20. 23:04
반응형
어떻게 풀지.. 하고 한시간 고민했다가 접근 방법을 찾아봤다.
간단하게 백트래킹으로 풀 수 있는 문제였다.
백트래킹이란, 내가 DFS의 활용에는 두 가지가 있다고 했었는데, 그 중 토글형 방식에 속한다.
"선택해서 진행하고, 이전 상태로 되돌아오는 방식". stack 느낌으로 진행되는 방식이다.
( A = true; DFS(); A = false; 형식)
갈때까지 가며 DFS 해주면서, 토글을 통해 백트래킹(다시 되돌아가는)하고 또 진행하고..!
/*
백트래킹(DFS 토글형) 문제였다.
갈때까지 가면서 진행해준다.
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int T;
char MAP[5][9];
int mx[4] = {0, 0, -1, 1};
int my[4] = {1, -1, 0, 0};
vector<pair<int, int>> result;
int COMP(pair<int, int> a, pair<int, int> b) {
if(a.first == b.first)
return a.second < b.second;
return a.first < b.first;
}
void DFS(int DEPTH) {
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 9; j++) {
if(MAP[i][j] == 'o') {
for(int k = 0; k < 4; k++) {
int tx = i + mx[k];
int ty = j + my[k];
if(tx < 0 || tx >= 5 || ty < 0 || ty >= 9)
continue;
int ttx = tx + mx[k];
int tty = ty + my[k];
if(ttx < 0 || ttx >= 5 || tty < 0 || tty >= 9)
continue;
if(MAP[tx][ty] == 'o' && MAP[ttx][tty] == '.') { // 움직일 수 있음.
MAP[i][j] = '.';
MAP[tx][ty] = '.';
MAP[ttx][tty] = 'o';
DFS(DEPTH + 1);
MAP[i][j] = 'o';
MAP[tx][ty] = 'o';
MAP[ttx][tty] = '.';
}
}
}
}
}
int CNT = 0;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 9; j++) {
if(MAP[i][j] == 'o') {
CNT++;
}
}
}
result.push_back({CNT, DEPTH});
}
int main() {
cin >> T;
while(T--) {
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 9; j++) {
cin >> MAP[i][j];
}
}
result.clear();
DFS(0);
sort(result.begin(), result.end(), COMP);
cout << result[0].first << " " << result[0].second << "\n";
}
}
소요 시간 : 1시간 40분
반응형