[백준] 16919 - 봄버맨 2

[백준] 16919 - 봄버맨 2

[문제링크]

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("

"); } } else if(n%2==0) { for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { sb.append("O"); }sb.append("

"); } } 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("

"); } } 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(y0 && 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 &↦[x-1][y]!=time)map[x-1][y]=empty; } static int pint(String s) { return Integer.parseInt(s); } }

결과 화면

from http://nato-blog.tistory.com/131 by ccl(S) rewrite - 2021-09-25 07:01:56