PS/Baekjoon Online Judge

[백준 14927] 전구 끄기 [C]

kimyoungrok 2021. 9. 2. 23:13

백준 - 14927


풀이

"백준 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

'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