[문제링크]

 

16919번: 봄버맨 2

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

www.acmicpc.net

 

0. 같은 코드로 봄버맨1(링크)도 해결 가능하다

 

1. 시작 직후를 제외하면, 빈공간을 채운다 - 터진다 - 빈공간을 채운다 - 터진다 - ... 순으로 반복되게 된다

 

2. 특정 시점 x에 폭탄이 놓인다면, x+1시점에는 x-2때 설치된 폭탄들이 터지며 방금 놓인 폭탄 중 일부가 제거된다

  • 이때 제거된 폭탄들은, x시점에 놓인 폭탄들 중 외곽과 닿은 폭탄들이다

 

3. x+2시점에는 새 폭탄이 설치되고, x+3시점에는 x때 설치된 폭탄들이 터지며 x+2폭탄 중 일부가 제거된다

  • 이때 제거된 폭탄들은, x시점에 놓인 폭탄들과 닿은 폭탄들이다

 

4.  즉, 2번에서 제거된 폭탄들과 3번에서 제거된 폭탄들은 그 위치가 같다

  • 얼음의 겉이 1칸 녹은 후, 다시 겉을 얼린다면 처음 그대로의 상태일 것
  • 항상 같은 위치를 제거해가며, 4초를 주기로 무한루프하게 된다

 

5. 즉 시작 직후만 따로 처리해주고, 나머지는 4로 나눈 만큼 진행하면 된다

  • 이때, 폭탄이 설치되는 짝수 시간에는 모든 칸에 폭탄이 위치하므로 진행할 필요 없이 처리 가능하다

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
	
	static int[][]map;
	static final int empty=-1;
	public static void main(String[] args)throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int r = pint(st.nextToken());
		int c = pint(st.nextToken());
		int n = pint(st.nextToken());
		map = new int[r][c];

		for (int i = 0; i < r; i++) {
			String s = br.readLine();
			for (int j = 0; j < c; j++) {
				map[i][j]=s.charAt(j)=='.'?empty:0;
			}
		}
		
		if(n==1) {
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					sb.append(map[i][j]==empty?'.':'O');
				}sb.append("\n");
			}
		}
		else if(n%2==0) {
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					sb.append("O");
				}sb.append("\n");
			}
		}
		else {
			n=n%4+4;
			for(int i = 2; i <= n; i++) {
				if(i%2==0) {
					set(true, i);
				}
				else {
					set(false,i);
				}
			}

			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					sb.append(map[i][j]==empty?'.':'O');
				}sb.append("\n");
			}
		}
		
		System.out.println(sb);
	}
	
	static void set(boolean mode, int time) {
		if(mode) {//set
			for (int i = 0; i < map.length; i++) {
				for (int j = 0; j < map[0].length; j++) {
					if(map[i][j]==empty)map[i][j]=time;
				}
			}
		}
		else {
			for (int i = 0; i < map.length; i++) {
				for (int j = 0; j < map[0].length; j++) {
					if(map[i][j]==time-3)bomb(i,j,time-3);
				}
			}
		}
	}
	static void bomb(int x, int y, int time) {
		map[x][y]=empty;
		if(y<map[0].length-1 && map[x][y+1]!=time)map[x][y+1]=empty;
		if(y>0 && map[x][y-1]!=time)map[x][y-1]=empty;
		if(x < map.length-1 && map[x+1][y]!=time)map[x+1][y]=empty;
		if(x>0 &&map[x-1][y]!=time)map[x-1][y]=empty;
	}
	
	static int pint(String s) {
		return Integer.parseInt(s);
	}
}

결과 화면

+ Recent posts