PS/Baekjoon Online Judge

[백준 14939] 불 끄기 [C]

kimyoungrok 2021. 9. 2. 22:02

백준 - 14939


풀이

주어진 예제는 직관적으로 풀이가 가능하지만 주어질 Test Case들을 고려하면 순차적으로 탐색하면서 풀이해야 한다.

우선 첫 번째 행에서 시도해볼 수 있는 모든 경우의 수를 시도한다면, 2~N번째 행에서는 이전 행의 불을 끄면 된다.

 

N번째 행을 검사해서 불이 전부 다 꺼졌다면 입력된 예제가 모두 불이 꺼진 경우이므로 그때 누른 스위치의 개수들의 최솟값을 저장해 출력해주면 된다.


소스코드

#include <stdio.h>
#include <string.h>
#include <memory.h>
#define min(a, b) a < b ? a : b
char bulb[10][10], temp[10][10];
const char* lRow = "##########";
int dx[5] = {0, -1, 1}, dy[5] = {0, 0, 0, -1, 1};

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 < 10 && ny < 10)
            temp[nx][ny] = (temp[nx][ny] == '#' ? 'O' : '#');
    }
}
int main(){
    for (int i = 0; i < 100; i++)
        scanf(" %c", &bulb[i/10][i%10]);
	
    int cnt = 101;
    for (int fRow = (1 << 10)-1; fRow >= 0; fRow--){
        int temp_cnt = 0;
        memcpy(temp, bulb, sizeof(bulb));

        for (int fCol = 0; fCol < 10; fCol++)
            if (fRow & (1 << fCol)){
                press(0, fCol);
                temp_cnt++;
            }
		
        for (int nRow = 1; nRow < 10; nRow++)
            for (int nCol = 0; nCol < 10; nCol++)
                if (temp[nRow-1][nCol] == 'O'){
                    press(nRow, nCol);
                    temp_cnt++;
                }
        
        if (!strcmp(temp[9], lRow))
            cnt = min(cnt, temp_cnt);
    }
    printf("%d\n", cnt == 101 ? -1 : cnt);
}

출처

 

14939번: 불 끄기

전구 100개가 10×10 정사각형 모양으로 늘어서 있다. 전구에 달린 스위치를 누르면 그 전구와 위, 아래, 왼쪽, 오른쪽에 있는 전구의 상태도 바뀐다. 전구 100개의 상태가 주어지면 모든 전구를 끄

www.acmicpc.net

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 1799] 비숍 [C]  (0) 2021.09.03
[백준 14927] 전구 끄기 [C]  (0) 2021.09.02
[백준 7579] 앱 [C]  (0) 2021.09.02
[백준 2143] 두 배열의 합 [C]  (0) 2021.09.02
[백준 5347] LCM [C]  (0) 2021.09.02