Develope/알고리즘

[백준 - 2140] 지뢰찾기

고로이 2017. 12. 19. 16:15
반응형

문제

지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는지에 대한 정보가 주어진다. 게이머는 게임을 진행하면서 보드의 칸을 하나씩 열게 된다. 만약 그 칸에 지뢰가 있다면 게임이 끝나고, 없는 경우에는 그 칸에 적혀있는 숫자, 즉 그 칸과 인접해 있는 8개의 칸들 중 몇 개의 칸에 지뢰가 있는지를 알 수 있게 된다.

이 문제는 보드의 테두리가 모두 열려있고, 그 외는 모두 닫혀있는 상태에서 시작한다. 예를 들어 다음과 같은 경우를 보자.

11100
2###1
3###1
2###1
12210

#는 닫혀있는 칸을 나타낸다. 이러한 보드가 주어졌을 때, 닫혀있는 칸들 중 최대 몇 개의 칸에 지뢰가 묻혀있는지 알아내는 프로그램을 작성하시오. 위의 예와 같은 경우에는 다음과 같이 6개의 지뢰가 묻혀있을 수 있다.

11100
2*  1
3***1
2** 1
12210

입력

첫째 줄에 N(1≤N≤100)이 주어진다. 다음 N개의 줄에는 N개의 문자가 공백 없이 주어지는데, 이는 게임 보드를 의미한다.

출력

첫째 줄에 묻혀있을 수 있는 지뢰의 최대 개수를 출력한다






이거 왜맞앗지...


나혹시 천재인가...?ㅎㅎㅎ;;


package beak.beak2140;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by eunbi on 2017-12-18.
*/
public class Minesweeper_eunbi {
public static int bombNum = 0;
public static int N = 5;
public static String[][] board = new String[N+1][N+1];
public static class Doll{
int x;
int y;
String value;
boolean bool;

public Doll(int x, int y, String value) {
this.x = x;
this.y = y;
this.value = value;
bool = false;
}
}
public static void main(String[] args) {

String input = "11100\n" +
"2###1\n" +
"3###1\n" +
"2###1\n" +
"12210";

int x=0;
int y=0;

List<Doll> dollList = new ArrayList<Doll>();
for(String line : input.split("\n")){
y = 0;
for(char c : line.toCharArray()){
board[x][y] = String.valueOf(c);
//if(c!='#')
dollList.add(new Doll(x,y,String.valueOf(c)));
y++;
}
x++;
}
printBoard();

while(dollList.size()>0){
for(int i=0;i<dollList.size();i++){
if(checkXY(dollList.get(i).x,dollList.get(i).y)){
dollList.remove(i);
}
}
}


printBoard();
System.out.println(bombNum);

}

public static boolean checkXY(int x, int y){
String value = board[x][y];
System.out.println("x : " + x + " / y : " + y + " / value : " + value);
Map<String, List<Doll>> readMap = new HashMap<String, List<Doll>>();

try{


readMap.put("*", new ArrayList<Doll>());
readMap.put("#", new ArrayList<Doll>());
readMap.put("x", new ArrayList<Doll>());

putMap(x - 1, y - 1, readMap);
putMap(x-1,y,readMap);
putMap(x-1,y+1,readMap);
putMap(x,y-1,readMap);
putMap(x,y+1,readMap);
putMap(x+1,y-1,readMap);
putMap(x+1,y,readMap);
putMap(x + 1, y + 1, readMap);

int num = Integer.parseInt(value);

if(num == 0) {
clearBomb(readMap.get("#"));
return true;
}
int bomb = readMap.get("*").size();
int nullNum = readMap.get("#").size();

if(num == bomb) {
clearBomb(readMap.get("#"));
return true;
}
if(num == bomb + nullNum){
putBomb(readMap.get("#"));
return true;
}

}catch (Exception e){
if(readMap.keySet().size() ==3){
board[x][y] = "*";
bombNum++;
}
return true;
}
return false;
}

public static void putBomb(List<Doll> bombList){
for(Doll doll : bombList){
board[doll.x][doll.y] = "*";
bombNum++;
}

}
public static void clearBomb(List<Doll> bombList){
for(Doll doll : bombList){
board[doll.x][doll.y] = "x";
}

}


public static void putMap(int x, int y, Map<String, List<Doll>> readMap){
if(x<0 || y<0 || x>N ||y>N) return;
if(readMap.containsKey(board[x][y])){
readMap.get(board[x][y]).add(new Doll(x, y, board[x][y]));

}else{
List<Doll> dollList = new ArrayList<Doll>();
dollList.add(new Doll(x, y, board[x][y]));
readMap.put(board[x][y], dollList);
}
}

public static void printBoard() {
StringBuilder sb = new StringBuilder();
sb.append("==========================\n");
for (int x = 0; x < N; x++) {
for (int y = 0; y < N; y++) {
sb.append(board[x][y] + " ");
}
sb.append("\n");
}
sb.append("==========================\n");
System.out.println(sb.toString());
}
}









반응형

'Develope > 알고리즘' 카테고리의 다른 글

[알고스팟] PICNIC - java  (4) 2018.02.06
[백준 - 1158] 조세퍼스 문제  (0) 2018.01.04
[알고스팟] XHAENEUNG  (5) 2017.12.11
[알고스팟] DIAMONDPATH  (2) 2017.12.11
[알고스팟] Quantization  (0) 2017.12.04