728x90
풀이
"백준 14939, 불 끄기"와 비슷하지만 행렬의 크기가 다른 문제다.
소스코드
#include <stdio.h>
#define min(a, b) a < b ? a : b
char bulb[18][18], temp[18][18];
int dx[5] = {0, -1, 1}, dy[5] = {0, 0, 0, -1, 1}, N;
void press(int x, int y){
for (int i = 0; i < 5; i++){
int nx = x + dx[i], ny = y + dy[i];
if (nx >= 0 && ny >= 0 && nx < N && ny < N)
temp[nx][ny] = (temp[nx][ny] == '1' ? '0' : '1');
}
}
int main(){
scanf("%d", &N);
for (int i = 0, val; i < N*N; i++)
scanf(" %c", &bulb[i/N][i%N]);
int cnt = N*N+1;
for (int fRow = (1 << N)-1; fRow >= 0; fRow--){
int temp_cnt = 0;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
temp[i][j] = bulb[i][j];
for (int fCol = 0; fCol < N; fCol++)
if (fRow & (1 << fCol)){
press(0, fCol);
temp_cnt++;
}
for (int nRow = 1; nRow < N; nRow++)
for (int nCol = 0; nCol < N; nCol++)
if (temp[nRow-1][nCol] == '1'){
press(nRow, nCol);
temp_cnt++;
}
int flag = 1;
for (int nCol = 0; nCol < N; nCol++)
if (temp[N-1][nCol] == '1'){
flag = 0;
break;
}
if (flag) cnt = min(cnt, temp_cnt);
}
printf("%d\n", cnt == N*N+1 ? -1 : cnt);
}
출처 및 참고자료
14927번: 전구 끄기
홍익이는 N x N 전구 판을 가지고 있다. 전구 판에는 각 칸마다 전구가 하나씩 연결되어 있다. 이 전구 판에서 하나의 전구를 누르면, 해당 전구를 포함하여 상하좌우의 총 5개 전구들의 상태가 변
www.acmicpc.net
[백준 14939] 불 끄기 [C]
풀이 주어진 예제는 직관적으로 풀이가 가능하지만 주어질 Test Case들을 고려하면 순차적으로 탐색하면서 풀이해야 한다. 우선 첫 번째 행에서 시도해볼 수 있는 모든 경우의 수를 시도한다면, 2~
kyr-db.tistory.com
728x90
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 9466] 텀 프로젝트 [C] (0) | 2021.09.04 |
---|---|
[백준 1799] 비숍 [C] (0) | 2021.09.03 |
[백준 14939] 불 끄기 [C] (0) | 2021.09.02 |
[백준 7579] 앱 [C] (0) | 2021.09.02 |
[백준 2143] 두 배열의 합 [C] (0) | 2021.09.02 |