문제
문제 바로가기> BOJ 9207번: 페그 솔리테어
9207번: 페그 솔리테어
각 테스트 케이스에 대해서, 핀을 움직여서 남길 수 있는 핀의 최소 개수와 그 개수를 만들기 위해 필요한 최소 이동 횟수를 출력한다.
www.acmicpc.net
풀이
문제가 잘 이해되지 않았다,, 푸는 것보다 이해하는 데 오래 걸렸다 ,,
테스트 케이스 1번에 대해 다음과 같이 핀이 3번 이동하는 것이다!!
###...###
..oo.....
.....oo..
.........
###...###
###...###
....o....
....o....
.........
###...###
###...###
....o....
.........
.........
###...###
#include<iostream>
#define R 5
#define C 9
using namespace std;
int pinCnt, minPin;
char map[R][C];
int dr[] = {-1, 1, 0, 0};
int dc[] = {0, 0, -1, 1};
void init(){
pinCnt = 0;
minPin = R*C;
}
void input(){
for (int i = 0; i < R; i++){
for (int j = 0; j < C; j++){
cin >> map[i][j];
if(map[i][j] == 'o') pinCnt++;
}
}
}
void backtracking(int pin){
minPin = min(pin, minPin); // ans update
for (int r = 0; r < R; r++){
for (int c = 0; c < C; c++){
if(map[r][c]!='o') continue;
for (int d = 0; d < 4; d++){
int nr = r + dr[d];
int nc = c + dc[d];
if(nr<0 || nr>=R || nc<0 || nc>=C || map[nr][nc]!='o') continue;
int nnr = r + dr[d] * 2;
int nnc = c + dc[d] * 2;
if(nnr<0 || nnr>=R || nnc<0 || nnc>=C || map[nnr][nnc]!='.') continue;
map[nnr][nnc] = 'o';
map[r][c] = map[nr][nc] = '.';
backtracking(pin - 1);
map[nnr][nnc] = '.';
map[r][c] = map[nr][nc] = 'o';
}
}
}
}
int main(){
freopen("../input.txt", "r", stdin);
ios_base::sync_with_stdio(0); cin.tie(0);
int N; cin >> N;
while (N--){
init();
input();
backtracking(pinCnt);
cout << minPin << " " << pinCnt-minPin << "\n";
}
}
'문제 풀이 > 백준' 카테고리의 다른 글
BOJ 16928번: 뱀과 사다리 게임 (0) | 2023.08.29 |
---|---|
BOJ 1347번: 미로 만들기 (0) | 2023.08.08 |
BOJ 11438번: LCA 2 (0) | 2023.04.20 |
BOJ 1799번: 비숍 (0) | 2023.04.06 |
BOJ 3055번: 탈출 (0) | 2023.04.05 |