※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14927번 문제인 전구 끄기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14927
14927번: 전구 끄기
홍익이는 N x N 전구 판을 가지고 있다. 전구 판에는 각 칸마다 전구가 하나씩 연결되어 있다. 이 전구 판에서 하나의 전구를 누르면, 해당 전구를 포함하여 상하좌우의 총 5개 전구들의 상태가 변
www.acmicpc.net
14939번 문제에서 변의 길이가 주어지는 형태로 바뀐 문제이다.
전체적인 풀이는 위의 문제와 같으니 위 글을 참고하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int count1(int x) {
int ret = 0;
while (x) {
if (x & 1) ret++;
x >>= 1;
}
return ret;
}
int board[19];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
int& x = board[i];
for (int j = 0; j < N; j++) {
x <<= 1;
int p; cin >> p;
x += p;
}
}
int ans = 1000000007;
int iterend = (1 << N);
int xornum = iterend - 1;
for (int i = 0; i < iterend; i++) {
int cnt = count1(i);
int old = board[0], cur = board[1];
old ^= i;
old ^= (i << 1);
old ^= (i >> 1);
cur ^= i;
old &= xornum;
for (int r = 1; r < N; r++) {
cnt += count1(old);
cur ^= old;
cur ^= (old << 1);
cur ^= (old >> 1);
cur &= xornum;
int tmp = old ^ board[r + 1];
old = cur;
cur = tmp;
}
if (old == 0) ans = min(ans, cnt);
}
if (ans < 1000000007) cout << ans;
else cout << -1;
}
'BOJ' 카테고리의 다른 글
[BOJ 14919 // C++] 분포표 만들기 (0) | 2022.04.24 |
---|---|
[BOJ 14926 // C++] Not Equal (0) | 2022.04.24 |
[BOJ 14924 // C++] 폰 노이만과 파리 (0) | 2022.04.24 |
[BOJ 14925 // C++] 목장 건설하기 (0) | 2022.04.24 |
[BOJ 14918 // C++] 더하기 (0) | 2022.04.24 |