※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23058번 문제인 뒤집기 게임이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23058
23058번: 뒤집기 게임
MBTI가 E(외향형)인 탐험가 백남이는 미지의 보물이 숨겨져 있다는 피라미드를 탐사 중이다. 무시무시한 함정들을 지나서 보물이 있는 방을 찾았지만, 보물상자를 열기 위해서는 수수께끼를 풀
www.acmicpc.net
N이 8 이하이므로, 줄을 뒤집을 수 있는 경우의 수는 2^16 = 65536이고, 검은 돌과 흰 돌을 한번에 센다면 줄을 N번 넘게 뒤집을 필요가 없다는 점을 고려하면, "줄 뒤집기를 먼저 하고, 돌 하나씩을 뒤집는" 경우의 수들을 전부 탐색하는 것으로 문제를 해결할 수 있다는 것을 알 수 있다.
돌 뒤집기는 xor 연산을 이용하면 간단히 구현할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N;
int arr[8][8];
int mx = 100;
void func(int idx, int cnt) {
if (cnt == N || idx == 2 * N) {
int w = 0;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
w += arr[r][c];
}
}
mx = min(mx, cnt + min(w, N * N - w));
return;
}
func(idx + 1, cnt);
if (idx < N) {
for (int r = 0; r < N; r++) {
arr[r][idx] ^= 1;
}
func(idx + 1, cnt + 1);
for (int r = 0; r < N; r++) {
arr[r][idx] ^= 1;
}
}
else {
for (int c = 0; c < N; c++) {
arr[idx - N][c] ^= 1;
}
func(idx + 1, cnt + 1);
for (int c = 0; c < N; c++) {
arr[idx - N][c] ^= 1;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
cin >> arr[r][c];
}
}
func(0, 0);
cout << mx;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17167 // C++] A Plus Equals B (0) | 2021.12.06 |
---|---|
[BOJ 1007 // C++] 벡터 매칭 (0) | 2021.12.05 |
[BOJ 16724 // C++] 피리 부는 사나이 (0) | 2021.12.03 |
[BOJ 2629 // C++] 양팔저울 (0) | 2021.12.02 |
[BOJ 11635 // C++] Wipe Your Whiteboards (0) | 2021.12.01 |