어흥

[백준 9207] 페그 솔리테어 (C++) 본문

알고리즘/백준

[백준 9207] 페그 솔리테어 (C++)

라이언납시오 2020. 3. 15. 19:59
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/9207

 

9207번: 페그 솔리테어

문제 페그 솔리테어는 구멍이 뚫려있는 이차원 게임판에서 하는 게임이다. 각 구멍에는 핀을 하나 꽂을 수 있다. 핀은 수평, 수직 방향으로 인접한 핀을 뛰어넘어서 그 핀의 다음 칸으로 이동하는 것만 허용된다. 인접한 핀의 다음 칸은 비어있어야 하고 그 인접한 핀은 제거된다. 현재 게임판에 꽂혀있는 핀의 상태가 주어진다. 이때, 핀을 적절히 움직여서 게임판에 남아있는 핀의 개수를 최소로 하려고 한다. 또, 그렇게 남기기 위해 필요한 최소 이동횟수를 구하는 프

www.acmicpc.net

1. 주의할 점

- 백트레킹을 통해서 구현한다(핀의 최대 개수: 8)

- 맵을 바꾼 후, 다시 돌아왔을 때 맵을 복구하는 과정이 필요하다

 

2. 구현

- DFS를 통해 백트레킹 방식으로 구현한다.

- 맵의 크기가 5X9밖에 되지 않으므로 매번 전부 확인한다. Arr[i][j]의 값이 'o'이라면 인접한칸과 인접한칸 다음의 칸을 살핀다.

- Back_tracking() 함수의 마지막에 현재 배열에 남아있는 'o'의 개수를 구한다.

- 결과는 Result(남아있는 'o'의 최솟값), 기존에 있던 'o'의 갯수 - Result를 출력한다.

 

#include <iostream>
#include <algorithm>
using namespace std;
int dx[4] = { 0,1,0,-1 };
int dy[4] = { -1,0,1,0 };
char arr[5][9];
int result, pin;

void back_tracking() {
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 9; j++) {
			if(arr[i][j]=='o'){
				for (int k = 0; k < 4; k++) {
					int nx = j + dx[k];
					int ny = i + dy[k];
					if (nx >= 0 && ny >= 0 && nx < 9 && ny < 5 && arr[ny][nx] == 'o') {
						int nnx = nx + dx[k];
						int nny = ny + dy[k];
						if (nnx >= 0 && nny >= 0 && nnx < 9 && nny < 5 && arr[nny][nnx] == '.') {
							arr[nny][nnx] = 'o';
							arr[ny][nx] = '.';
							arr[i][j] = '.';
							back_tracking();
							arr[nny][nnx] = '.';
							arr[ny][nx] = 'o';
							arr[i][j] = 'o';
						}
					}
				}
			}
		}
	}
	int temp = 0;
	for (int i = 0; i < 5; i++) 
		for (int j = 0; j < 9; j++) 
			if (arr[i][j] == 'o') 
				temp++;
	result = min(result, temp);
}

int main() {
	int test;
	cin >> test;
	for (int t = 0; t < test; t++) {
		result = 9;
		pin = 0;
		for (int i = 0; i < 5; i++)
			for (int j = 0; j < 9; j++) {
				cin >> arr[i][j];
				if (arr[i][j] == 'o') pin++;
			}
		back_tracking();
		cout << result << " " << pin - result << '\n';
	}
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 14405] 피카츄 (C++)  (0) 2020.03.16
[백준 2151] 거울 설치 (C++)  (0) 2020.03.16
[백준 1477] 휴게소 세우기 (C++)  (0) 2020.03.15
[백준 1309] 동물원 (C++)  (0) 2020.03.13
[백준 13459] 구슬 탈출 (C++)  (0) 2020.03.13
Comments