ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ 16918] 봄버맨
    Problem Solving 2023. 10. 17. 18:32

    https://www.acmicpc.net/problem/16918

     

    16918번: 봄버맨

    첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.

    www.acmicpc.net

     

    처음에는 다음 네 과정이 반복되는 줄 알았다.

    초기 상태 > 폭탄이 가득 찬 상태 > 초기에 설치된 폭탄이 터진 상태 > 폭탄이 가득 찬 상태

    그래서, n을 4로 나눈 나머지가 1일 때와 3일 때, 그리고 n이 짝수일 때 세 가지 경우가 생길 것을 판단해서 단순히 나머지로 케이스를 나누었으나 틀렸다.

     

    위 사이클을 한 번 돈 다음에 초기 상태와 같지 않은 반례가 있었다.

    3 4 5

    OOO.

    OOOO

    OOOO 

    위 예의 경우, 5초 후에는 전체가 빈 칸이 된다.

    즉, n이 1일 때, 2로 나누어 떨어질 때, n이 4보다 크고 나머지가 1일 때, 나머지가 3일 때의 네 가지 상태가 존재하는 것이다.

     

    그냥 각 상태를 재현해서 무식하게 풀었다.

    #include <iostream>
    #include <vector>
    #include <utility>
    
    void	printBoard(char board[200][200], int r, int c) {
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			std::cout << board[i][j];
    		}
    		std::cout << '\n';
    	}
    }
    
    void	getBombCoordinates(std::vector<std::pair<int, int> > &bomb,
    							 char board[200][200], int r, int c)
    {
    	std::pair<int, int> temp;
    
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			if (board[i][j] == 'O') {
    				temp.first = i;
    				temp.second = j;
    				bomb.push_back(temp);
    			}
    		}
    	}
    }
    
    void	explodeBomb(std::vector<std::pair<int, int> > &bomb,
    						 char board[200][200], int r, int c)
    {
    	std::vector<std::pair<int, int> >::iterator it = bomb.begin();
    	std::vector<std::pair<int, int> >::iterator end = bomb.end();
    
    	while (it != end) {
    		int i = (*it).first;
    		int j = (*it).second;
    		board[i][j] = '.';
    		if (i > 0) {
    			board[i - 1][j] = '.';
    		}
    		if (i < r - 1) {
    			board[i + 1][j] = '.';
    		}
    		if (j > 0) {
    			board[i][j - 1] = '.';
    		}
    		if (j < c - 1) {
    			board[i][j + 1] = '.';
    		}
    		++it;
    	}
    }
    
    void	setBomb(char board[200][200], int r, int c) {
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			board[i][j] = 'O';
    		}
    	}
    }
    
    int main(void) {
    	int r, c, n;		
    	char board[200][200];
    
    	std::cin >> r >> c >> n;
    	std::cin.ignore();
    
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			std::cin >> board[i][j];
    		}
    		std::cin.ignore();
    	}	
    
    	if (n == 1) {
    		printBoard(board, r, c);
    		return 0;
    	}
    
    	if (n % 2 == 0) {
    		for (int i = 0; i < r; i++) {
    			for (int j = 0; j < c; j++) {
    				std::cout << 'O';
    			}
    			std::cout << '\n';
    		}
    		return 0;
    	}
    
    	std::vector<std::pair<int, int> > bombA;
    	std::vector<std::pair<int, int> > bombB;
    
    	getBombCoordinates(bombA, board, r, c);
    
    	for (int i = 2; i <= n; i++) {
    		if (i % 2 == 0) {
    			setBomb(board, r, c);
    		} else if (i % 4 == 1) {
    			explodeBomb(bombB, board, r, c);
    			bombB.clear();
    			getBombCoordinates(bombA, board, r, c);
    		} else if (i % 4 == 3) {
    			explodeBomb(bombA, board, r, c);
    			bombA.clear();
    			getBombCoordinates(bombB, board, r, c);
    		}
    	}
    
    	printBoard(board, r, c);
    	
    	return 0;
    }

    'Problem Solving' 카테고리의 다른 글

    [BOJ 9881] Ski Course Design  (0) 2023.10.15
    [백준/C] 2941  (0) 2022.07.15
    [백준/C] 5622  (0) 2022.07.13
    [백준/C] 2908  (0) 2022.07.13
    [백준/C] 1152  (0) 2022.07.13
Designed by Tistory.