BOJ7569 토마토

2024. 3. 11. 15:51· Problem Solving/BFS

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

형제 문제

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

import java.io.*;
import java.util.*;
public class Main
{
    static int n;
    static int m;
    static int h;
    static int[][][] map;
    static boolean[][][] visited;
    
    public static int bfs(Queue<Node> q){
        
        int[] move_h = {0, 0, 0, 0, 1, -1};
        int[] move_r = {1, -1, 0, 0, 0, 0};
        int[] move_c = {0, 0, 1, -1, 0, 0};
        int step=0;
        while(q.size()>0){
            // System.out.println(q);
            Node node = q.poll();
            step=node.step;
            for(int i=0;i<6;i++){
                Node next = new Node(node.h+move_h[i],node.r+move_r[i],node.c+move_c[i],node.step+1);
                if(next.h>=0 && next.r>=0 && next.c>=0 && next.h< h && next.r< n && next.c < m){
                    if(!visited[next.h][next.r][next.c] && map[next.h][next.r][next.c]==0){
                        visited[next.h][next.r][next.c] = true;
                        q.offer(next);
                    }
                }
            }
        }

        return step;
    }
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] input1 = br.readLine().split(" ");
		m = Integer.parseInt(input1[0]);
        n = Integer.parseInt(input1[1]);		
        h = Integer.parseInt(input1[2]);
        map = new int[h][n][m];        
        visited = new boolean[h][n][m];
        Queue<Node> q = new LinkedList();
        boolean exist_0 = false;
        for(int i=0;i<h;i++){
            for(int j=0; j<n;j++){
                String[] temp = br.readLine().split(" ");
                for(int k=0;k<m;k++){
                    map[i][j][k] = Integer.parseInt(temp[k]);
                    if(map[i][j][k]==1){
                        q.offer(new Node(i,j,k,0));
                        visited[i][j][k] = true;
                    }
                    if(map[i][j][k]==0){
                        exist_0=true;
                    }
                    
                }
            }
        }
		
		
		if(q.size()==0 && exist_0){
		    System.out.println(-1);
		    return;
		}
		int ans = bfs(q);
		
		for(int i=0;i<h;i++){
            for(int j=0; j<n;j++){
                for(int k=0;k<m;k++){
                    if(!visited[i][j][k] && map[i][j][k]==0){
                        System.out.println(-1);
                        return;    
                    }
                    
                }
            }
        }
        
        System.out.println(ans);
		

		
	}
	
	public static class Node{
	    int r;
	    int c;
	    int h;
	    int step;
	    public Node(int h, int r ,int c ,int step){
	        this.r = r;
	        this.c = c;
	        this.h = h;
	        this.step = step;
	    }
	    public String toString(){
	        return "["+h+", "+r+", "+c+", "+step+" ]";
	    }
	}
}

 

7576의 코드

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

class Main {
    static int n, m;
    static int[][] board;
    static int[][] visited;
    static int[] dr = {-1, 1, 0, 0};
    static int[] dc = {0, 0, -1, 1};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();
        board = new int[n][m];
        visited = new int[n][m];

        Queue<Point> q = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                board[i][j] = sc.nextInt();
                if (board[i][j] == 1) {
                    q.add(new Point(i, j));
                    visited[i][j] = 1;
                }
            }
        }

        while (!q.isEmpty()) {
            Point now = q.poll();
            for (int i = 0; i < 4; i++) {
                int nr = now.r + dr[i];
                int nc = now.c + dc[i];
                if (nr < 0 || nr >= n || nc < 0 || nc >= m) continue;
                if (visited[nr][nc] == 0 && board[nr][nc] == 0) {
                    visited[nr][nc] = visited[now.r][now.c] + 1;
                    q.add(new Point(nr, nc));
                }
            }
        }
        int max = 0;
        boolean yummy = true;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                max = Math.max(max, visited[i][j]);
                if (visited[i][j] == 0 && board[i][j] == 0) {
                    yummy = false;
                    break;
                }
            }
        }
        if (yummy) System.out.println(max - 1);
        else System.out.println(-1);
    }
}

class Point {
    int r, c;

    public Point(int r, int c) {
        this.r = r;
        this.c = c;
    }
}

'Problem Solving > BFS' 카테고리의 다른 글

BOJ9019 DSLR  (0) 2024.03.11
BOJ5427 불  (0) 2024.03.11
BOJ7562 나이트의 이동  (0) 2024.03.10
BOJ 12851 숨바꼭질2  (0) 2024.03.10
BOJ1697 숨바꼭질  (0) 2024.03.10
'Problem Solving/BFS' 카테고리의 다른 글
  • BOJ9019 DSLR
  • BOJ5427 불
  • BOJ7562 나이트의 이동
  • BOJ 12851 숨바꼭질2
윤재에요
윤재에요
윤재에요
yunzae.log
윤재에요
전체
오늘
어제
  • 분류 전체보기 (438)
    • Computer Science (115)
      • 데이터베이스 (50)
      • 네트워크 (18)
      • 소프트웨어 공학 (1)
      • 알고리즘 (10)
      • 자료구조 (9)
      • 컴퓨터구조 (0)
      • 운영체제 (0)
      • 데이터 통신 (16)
      • 프로그래밍언어론 (11)
    • Project (20)
      • 후크(Flutter) (1)
      • BDSR로그북(App,BackEnd) (2)
      • 나만의 주점(STM32,Arduino,androi.. (9)
      • 공다(App,BackEnd) (2)
      • 카카오쇼핑 클론코딩 (4)
      • 암호화폐자동매매 (2)
    • Problem Solving (208)
      • 자바 문법 (20)
      • 파이썬 문법,함수 (6)
      • 그리디 (5)
      • 구현 (43)
      • DFS (3)
      • BFS (17)
      • 정렬 (15)
      • 이진 탐색 (16)
      • 다이나믹 프로그래밍 (6)
      • 최단 경로 (5)
      • 그래프 (1)
      • 자료구조 (5)
      • 투포인터 (15)
      • SQL (44)
      • 구간합 (7)
    • I leaned (78)
      • 스프링,스프링부트 (31)
      • Git (6)
      • JAVA (5)
      • Etc (30)
    • 취업 (15)
      • PT면접 (6)
      • 기술면접 (9)
      • 인성면접 (0)
    • log (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 다익스트라
  • 제약 사항
  • 개미전사
  • 플로이드 워셜
  • 파이썬
  • 그리디
  • 재시도
  • 데이터베이스
  • 부품찾기
  • 다이어그램
  • 다이나믹프로그래밍
  • 최단 거리
  • 참조 무결성
  • 효율적인화폐구성
  • 최단거리
  • 이것이 코딩테스트다.
  • 먀
  • 교환정렬
  • 기수정렬
  • Relationship model
  • E-R Model
  • DP
  • 다이나믹
  • 이것이 코딩테스트다
  • weak entity
  • UML
  • 이것이코딩테스트다
  • 계수정렬
  • 힙큐
  • 카카오테크캠퍼스

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
윤재에요
BOJ7569 토마토
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.