728x90
300x250
https://www.acmicpc.net/problem/1012
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
1은 배추가 있다는 것을 의미하고 0은 배추가 없다는 것을 의미한다.
배추가 상하좌우 4방향 기준으로 인접해 있는것들은 배추흰지렁이가 한 마리만 있으면 된다.
문제에서 가로,세로 순으로 제공한다했는데 세로,가로 순으로 풀어야 맞는 것 같다..
가로 10 세로 8 주고나서 배추 위치를 9 0 이렇게 줘버리면.. 세로가 10인건데 ㅠ 헤맸잖아용
import java.util.Scanner;
public class Main {
public static int T,N,M,K,ans = 0;
public static int[][] map;
public static boolean[][] visit;
public static int[] dx = {0,1,0,-1};//동남서북
public static int[] dy = {1,0,-1,0};//동남서북
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
T = sc.nextInt();
for (int tc = 0; tc < T; tc++) {
ans = 0;
N = sc.nextInt();
M = sc.nextInt();
K = sc.nextInt();
map = new int[N][M];
visit = new boolean[N][M];
for (int i = 0; i < K; i++) {
int row = sc.nextInt();
int col = sc.nextInt();
map[row][col]=1;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(map[i][j]==0)
continue;
if(visit[i][j])
continue;
visit[i][j]=true;
dfs(i,j);
ans++;
}
}
System.out.println(ans);
}
}
public static void dfs(int row, int col) {
//방향 탐색
for (int i = 0; i < dx.length; i++) {
int nx = row + dx[i];
int ny = col + dy[i];
//종료조건
//배열 범위 밖이냐?
if(nx >= N || ny >= M || nx < 0 || ny < 0 )
continue;
//배추가 없냐?
if(map[nx][ny]==0)
continue;
//이미 들른 곳이냐?
if(visit[nx][ny])
continue;
visit[nx][ny]=true;
dfs(nx,ny);
}
}
}
728x90
'알고리즘 > DFS & BFS' 카테고리의 다른 글
백준 2178번: 미로 탐색 (0) | 2020.03.01 |
---|---|
백준 2583번: 영역 구하기 (0) | 2020.03.01 |
백준 7576번: 토마토 (0) | 2020.02.28 |
SWEA - 2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2020.02.28 |
[JAVA] DFS와 BFS의 기본 형태 (0) | 2020.02.28 |