2013년 5월 20일 월요일

Programming Challenges: Minesweeper(PC/UVa ID: 110102/10189)


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

public class Exercise2Mdf {

  static int num = 0;
  final static String REG_WHITESPACE = "\\s+";
  /**
   * @param args
   */
  public static void main(String[] args) {
    System.out.println("Start!");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String[] nM;  //행렬(NxM)의 집합
    String[][] fld; //행렬에 따른 필드값
    String line = "";
    try {
      while((line = br.readLine())!=null){
        
        line = line.trim().replaceAll(REG_WHITESPACE, " ");
        nM = line.split(" ");
        int matrixN = Integer.parseInt(nM[0]);
        int matrixM = Integer.parseInt(nM[1]);
        
        fld = new String[matrixN][matrixM];
        if(Integer.parseInt(nM[0]) == 0 && Integer.parseInt(nM[1]) == 0){
          return;
        }
        
        //필드값 초기화
        for(int i=0; i<matrixN; i++){
          for(int j=0; j<matrixM; j++){
            fld[i][j] = "0";
          }
        }
        
        
        int bombLine = 0; //행렬 한 셋트당 지뢰밭의 행번호
        //행렬에 따른 지뢰의 갯수 저장.
        while((line = br.readLine())!=null){
          char[] bomb = line.toCharArray();
          
          for(int j=0; j<bomb.length; j++){
            if((j+1) == matrixM){
              break;
            }
            //핵심 : 현재 위치가 *이면 주위 8개 위치에 1을 더한다.
            if(bomb[j] == '*'){
              fld[bombLine][j] = "*";
              for(int a=bombLine-1; a<=bombLine+1; a++){
                for(int b=j-1; b<=j+1; b++){
                  if((a>=0) && (a<matrixN) &&(b>=0) && (b<matrixM)){
                    if(!fld[a][b].equals("*")){
                      fld[a][b] = String.valueOf(Integer.parseInt(fld[a][b])+1);
                    }
                  }
                }
              }
            }
          }
          
          bombLine++;
          
          if(bombLine == matrixN) break;
        }
        num++;  //지뢰밭 셋트 누적
        
        //출력 시작
        StringBuffer sb = new StringBuffer();
        sb.append(System.getProperty("line.separator"));
        sb.append("Field #"+num+":");
        for(int i=0; i<matrixN; i++){
          sb.append(System.getProperty("line.separator"));
          for(int j=0; j<matrixM; j++){
            sb.append(fld[i][j]);
          }
        }
        System.out.println(sb.toString());
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

댓글 없음 :

댓글 쓰기