접근

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

 

16918번: 봄버맨

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

www.acmicpc.net

단순 구현 문제였습니다. 각 칸에 폭탄이 생긴지 얼마나 지났는지를 표시하고, 폭탄이 없는 칸은 -1로 표시하였습니다. 폭탄이 모두 동시에 터진다는 것에 주의하며 탐색해주었습니다.

추가적으로 규칙성도 찾을 수 있었는데, 0, 1 즉, 처음 위치에서 1초가 지날때까지는 문제에 따라 달라질 수 있지만, 2, 3, 4, 5초에 해당하는 모습이 그 뒤로도 계속 반복된다는 것입니다. 따라서 게임이 시작되고 5초가 지날 때까지의 지도의 모습을 저장해두고, N의 수에 따라 해당하는 지도를 표시함으로써 시간을 단축할 수 있었습니다.

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {

  static int R, C, N;
  static int[][][] map;
  static int[] dr = { 0, 1, 0, -1 };
  static int[] dc = { 1, 0, -1, 0 };

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    R = Integer.parseInt(st.nextToken());
    C = Integer.parseInt(st.nextToken());
    N = Integer.parseInt(st.nextToken());
    map = new int[R][C][6];
    for (int i = 0; i < R; i++) {
      String input = br.readLine();
      for (int j = 0; j < C; j++) {
        if (input.charAt(j) == '.') {
          map[i][j][0] = -1;
        } else {
          map[i][j][0] = 0;
        }
      }
    }
    br.close();
    for (int i = 0; i < 5; i++) {
      calculate(i);
    }
    if (N < 2) {
      printmap(N);
    } else {
      printmap((N - 2) % 4 + 2);
    }
  }

  static void printmap(int n) {
    StringBuilder sb = new StringBuilder();
    for (int r = 0; r < R; r++) {
      for (int c = 0; c < C; c++) {
        if (map[r][c][n] == -1) {
          sb.append('.');
        } else {
          sb.append('O');
        }
      }
      sb.append('\n');
    }
    System.out.print(sb.toString());
  }

  static void calculate(int n) {
    if (n % 2 == 0 || n == 0) {
      for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
          if (map[r][c][n] == -1) {
            map[r][c][n + 1] = -1;
          } else {
            map[r][c][n + 1] = map[r][c][n] + 1;
          }
        }
      }
      for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
          if (map[r][c][n] == 2) {
            map[r][c][n + 1] = -1;
            for (int i = 0; i < 4; i++) {
              int nr = r + dr[i];
              int nc = c + dc[i];
              if (nr < 0 || R <= nr || nc < 0 || C <= nc) continue;
              map[nr][nc][n + 1] = -1;
            }
          }
        }
      }
    } else {
      for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
          map[r][c][n + 1] = map[r][c][n] + 1;
        }
      }
    }
  }
}

더 생각해 볼 것?

...

코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기