※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 9079번 문제인 동전 게임이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/9079
9079번: 동전 게임
입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 세 줄로 이루어지며, 한 줄에 세 개의 동전모양이 주어지는데, 각각의 동전 표시 사이에는 하나의 공백이
www.acmicpc.net
같은 뒤집을 수 있는 방법을 2회 시행하는 것은 그 시행을 하지 않는 것과 같으므로, 각 뒤집을 수 있는 방법에 대하여 2회 이상 뒤집는 경우는 고려할 필요가 없음을 관찰하자. 즉, 문제의 답이 될 가능성이 있는 있는 시행은 가능한 각 시행에 대하여 그 시행을 하거나 안 하거나의
위의 각 경우를 완전탐색하여 문제를 해결하자. 글쓴이는 각 뒤집는 방법별로 뒤집게 되는 칸을 정리한 flips 배열을 아래와 같이 만들어 완전탐색을 구현하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int T;
int ans, cnt;
pair<int, int> flips[8][3];
int board[3][3];
void func(int idx) {
if (idx == 8) {
int cur = board[0][0];
bool chk = 1;
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
if (board[r][c] ^ cur) chk = 0;
}
}
if (chk) ans = min(ans, cnt);
}
else {
func(idx + 1);
for (int i = 0; i < 3; i++) {
int r = flips[idx][i].first, c = flips[idx][i].second;
board[r][c] ^= 1;
}
cnt++;
func(idx + 1);
cnt--;
for (int i = 0; i < 3; i++) {
int r = flips[idx][i].first, c = flips[idx][i].second;
board[r][c] ^= 1;
}
}
}
void solve() {
ans = 1000000007, cnt = 0;
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
char tmp; cin >> tmp;
if (tmp == 'H') board[r][c] = 0;
else board[r][c] = 1;
}
}
func(0);
if (ans > 1000000000) cout << -1 << '\n';
else cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
flips[0][0] = { 0,0 }, flips[0][1] = { 0,1 }, flips[0][2] = { 0,2 };
flips[1][0] = { 1,0 }, flips[1][1] = { 1,1 }, flips[1][2] = { 1,2 };
flips[2][0] = { 2,0 }, flips[2][1] = { 2,1 }, flips[2][2] = { 2,2 };
flips[3][0] = { 0,0 }, flips[3][1] = { 1,0 }, flips[3][2] = { 2,0 };
flips[4][0] = { 0,1 }, flips[4][1] = { 1,1 }, flips[4][2] = { 2,1 };
flips[5][0] = { 0,2 }, flips[5][1] = { 1,2 }, flips[5][2] = { 2,2 };
flips[6][0] = { 0,0 }, flips[6][1] = { 1,1 }, flips[6][2] = { 2,2 };
flips[7][0] = { 2,0 }, flips[7][1] = { 1,1 }, flips[7][2] = { 0,2 };
cin >> T;
while (T--) solve();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 3185 // C++] kviz (0) | 2023.10.07 |
---|---|
[BOJ 11501 // C++] 주식 (1) | 2023.10.06 |
[BOJ 9078 // C++] 정렬 (1) | 2023.10.04 |
[BOJ 2016 // C++] 미팅 주선하기 (0) | 2023.10.03 |
[BOJ 9464 // C++] 직사각형 집합 (1) | 2023.10.02 |