코드굽는 타자기
SWEA[1868] - 파핑파핑 지뢰찾기[D4] 본문
링크
SWEA[1868]
문제설명
- 그래프의 연결성 탐색 문제
문제풀이
- 0인칸중 연결된 0칸 탐색 후, 0인칸 주변칸 드러낸 뒤에 나머지 칸 count.
문제코드
import java.util.LinkedList;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class Solution{
public static int[][] dir= {
{-1,0},
{-1,1},
{0,1},
{1,1},
{1,0},
{1,-1},
{0,-1},
{-1,-1}
};
public static int Ans=0;
public static int N;
public static char[][] map;
public static boolean[][] visit;
public static boolean is_0(int[]rc) {
int nr;
int nc;
for (int d = 0; d < 8; d++) {
nr = rc[0] + dir[d][0];
nc = rc[1] + dir[d][1];
// 경계 안에서
if(nr>=0 && nr<N && nc>=0 && nc<N) {
// 지뢰가 하나라도 있으면
if(map[nr][nc]=='*') {
return false;
}
}
}
// 지뢰 없음
return true;
}
public static boolean non_0(int[]rc) {
int nr;
int nc;
for (int d = 0; d < 8; d++) {
nr = rc[0] + dir[d][0];
nc = rc[1] + dir[d][1];
// 경계 안에서
if(nr>=0 && nr<N && nc>=0 && nc<N) {
// 0인칸(true)가 하라나도 있으면
if(visit[nr][nc]) {
return false;
}
}
}
// 0인칸(true)
return true;
}
public static void main(String args[]) throws Exception
{
//System.setIn(new FileInputStream("res/swea/1868.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T;
T=Integer.parseInt(br.readLine().trim());
for(int test_case = 1; test_case <= T; test_case++)
{
N = Integer.parseInt(br.readLine());
map = new char[N][N];
visit = new boolean[N][N];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
}
LinkedList<int[]> q = new LinkedList<int[]>();
int[] now;
int nr;
int nc;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// 방문 가능한 경우 ('.' && visit false) && 0인 경우
if(map[i][j]=='.' && !visit[i][j] && is_0(new int[] {i,j})) {
Ans++;
visit[i][j]=true;
q.add(new int[] {i,j});
while(!q.isEmpty()) {
now = q.poll();
for (int d = 0; d < 8; d++) {
nr = now[0] + dir[d][0];
nc = now[1] + dir[d][1];
// 경계안에서 그 다음칸도 0이면
if(nr>=0 && nr<N && nc>=0 && nc<N && !visit[nr][nc] && is_0(new int[] {nr,nc})) {
visit[nr][nc]=true;
q.add(new int[] {nr,nc});
}
}
}
}
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(visit[i][j]==false && map[i][j]=='.' && non_0(new int[] {i,j})) {
Ans++;
}
}
}
System.out.println("#"+test_case+" "+Ans);
// 초기화
Ans=0;
}
}
}
아쉬운점
- 지뢰 갯수 표시하는 기능은 안만들었음, 굳이 필요없는거같아서
- 어찌저찌 답구하는거 주먹구구식으로 한듯
잘한점
- 8방탐색
- 그래프 연결성 검사를 BFS로 함
- 30min
'알고리즘 > 깊이&너비 우선 탐색(DFS&BFS)' 카테고리의 다른 글
Baekjoon[16234] - 인구 이동 (0) | 2020.03.02 |
---|---|
SWEA[2112] - 보호필름 (0) | 2020.02.23 |
Baekjoon[2468] - 안전 영역 (0) | 2020.02.20 |
SWEA[2105] - 디저트 카페 (0) | 2020.02.19 |
Baekjoon[1260] - DFS와 BFS (0) | 2020.02.18 |
Comments