[Java]伯俊7576号[トマト]ジャワ
白駿7576号です.
https://www.acmicpc.net/problem/7576
質問する
https://www.acmicpc.net/problem/7576
質問する
チョルスのトマト農場にはトマトを保管する大きな倉庫がある.トマトは下図のように1つずつ四角い格子に入れて倉庫に保管しています.
倉庫に保管されているトマトの中には、熟しているものもあれば、まだ熟していないものもあります.1日保管した後、熟したトマトに隣接する未熟のトマトは、熟したトマトの影響を受けて成熟する.1つのトマトの隣接する場所は、左、右、前、後の4つの方向に位置するトマトを意味する.対角線方向に影響を与えないトマトは、トマトが自分で成熟しないと仮定します.哲洙は倉庫に保管されているトマトが何日で熟れるか、最低日数を知りたいと思っている.
倉庫にトマトのチェックボックスの大きさ、熟したトマトと未熟なトマトの情報を保管している場合、数日後には、トマトが熟しているかどうか、最低日数を求めるプログラムを作成します.しかし、箱のいくつかの格にはトマトが入っていないかもしれません.
入力
最初の行は、ボックスのサイズを表す2つの整数M,Nを与える.Mは箱の横格子数,Nは箱の縦格子数を表す.しかし,2≦M,N≦1000であった.2行目から、1つの箱に保存されているトマトの情報が提供されます.つまり、2行目からN行目まで、箱の中のトマトの情報が出てきます.1本の線上で、箱の横線のトマトの状態はM個の整数である.整数1は熟したトマトを表し、整数0は未熟のトマトを表し、整数-1はトマトを含まない格子を表す.
トマトが1つ以上ある場合にのみ入力します.
しゅつりょく
トマトがすべて熟成した最小日付を印刷します.保存からすべてのトマトが熟成している場合は0を、トマトが熟成していない場合は-1を出力します.
考える
熟したトマトは時々両側にある.
つまり、箱の中には1がたくさんあります.これが私たちが解決しなければならない問題の核心です.
成熟したトマトを同時に散布してこそ、最小限の日数を見つけることができる.
そのためDFSは非常に困難であり,BFSを用いて問題を解決する必要がある.
BFSを使用するため、キューを作成し、x、y座標値のノードオブジェクトを作成します.
私たちは初めて箱box
の並びを作り、1が現れるとすぐにque
に入れました.
こうしてBFSの閲覧を1の位置で開始する.
アクション
ボックスの範囲に入ります.アクセスはありません.ボックスは0です.if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 )
条件を満たす価格はque
に追加されます.
その後visit
をtrue値に、アクセスしたボックスを1に変更します.
ここで1に変えた理由は、後で-1に未熟なトマトがあるから
この値を処理するには、BFSナビゲーションが完了した後にゼロ値を検索する必要があります.
BFSが終わってからまだ0が残っていれば、熟したトマトがあるかどうかを意味します.
このように異なる方向の1がque
box
に入る1は徐々に増加する.
さらに探索できる場所がなければ、que
はすべて空になり、BFS探索は終了する.
2 D配列を繰り返して、最後のボックスを決定します.
0が存在する場合は、-1を出力して戻ります.
トマトが熟していることを確認したときque
は、1から始まるので、0から計算を開始するために値を出力する.
そして熟したトマトがなかったらcount
を生成するとともに、box
という変数を用いて直接フィルタリングすることができる.zero_test
をfalseに初期化し、zero_test
が最初に作成されると、0が1つある場合、true処理が行われる.box
が既に作成されているがfalseである場合、このボックスには成熟したトマトがないことを示すため、0を直接印刷して戻ります.
TMI
ハンバーガーにトマトが嫌いな人はいますか?
ハンバーガーのトマトはパイナップルピザみたい...
コード#コード#
BFSの使用
import java.util.*;
import java.io.*;
public class Main {
static int dirX[] = {0, 0, -1, 1};
static int dirY[] = {-1, 1, 0, 0};
static int box[][];
static boolean visit[][];
static Queue<Node> que = new LinkedList<>();
static int N, M;
static int now_x, now_y;
static int count = 0;
private static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
boolean zero_test = false;
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
box = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++) {
int num = Integer.parseInt(st.nextToken());
if(num == 1) {
que.offer(new Node(j, i));
}
else if(num == 0) {
zero_test = true;
}
box[i][j] = num;
}
}
if(zero_test == false) {
System.out.println(0);
return;
}
while( !que.isEmpty() ) {
BFS(que.size());
count++;
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(box[i][j]== 0) {
System.out.println(-1);
return;
}
}
}
System.out.println(count -1);
}
static void BFS(int size) {
while( size-- >0 ) {
Node node = que.poll();
for(int i=0; i<4; i++) {
now_x = node.x + dirX[i];
now_y = node.y + dirY[i];
if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 ) {
que.offer(new Node(now_x, now_y));
visit[now_y][now_x] = true;
box[now_y][now_x] = 1;
}
}
}
}
private static boolean Range_check() {
return (now_x >= 0 && now_y >= 0 && now_x < M && now_y < N);
}
}
Reference
この問題について([Java]伯俊7576号[トマト]ジャワ), 我々は、より多くの情報をここで見つけました
https://velog.io/@lifeisbeautiful/Java-백준-7576번-토마토-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
最初の行は、ボックスのサイズを表す2つの整数M,Nを与える.Mは箱の横格子数,Nは箱の縦格子数を表す.しかし,2≦M,N≦1000であった.2行目から、1つの箱に保存されているトマトの情報が提供されます.つまり、2行目からN行目まで、箱の中のトマトの情報が出てきます.1本の線上で、箱の横線のトマトの状態はM個の整数である.整数1は熟したトマトを表し、整数0は未熟のトマトを表し、整数-1はトマトを含まない格子を表す.
トマトが1つ以上ある場合にのみ入力します.
しゅつりょく
トマトがすべて熟成した最小日付を印刷します.保存からすべてのトマトが熟成している場合は0を、トマトが熟成していない場合は-1を出力します.
考える
熟したトマトは時々両側にある.
つまり、箱の中には1がたくさんあります.これが私たちが解決しなければならない問題の核心です.
成熟したトマトを同時に散布してこそ、最小限の日数を見つけることができる.
そのためDFSは非常に困難であり,BFSを用いて問題を解決する必要がある.
BFSを使用するため、キューを作成し、x、y座標値のノードオブジェクトを作成します.
私たちは初めて箱box
の並びを作り、1が現れるとすぐにque
に入れました.
こうしてBFSの閲覧を1の位置で開始する.
アクション
ボックスの範囲に入ります.アクセスはありません.ボックスは0です.if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 )
条件を満たす価格はque
に追加されます.
その後visit
をtrue値に、アクセスしたボックスを1に変更します.
ここで1に変えた理由は、後で-1に未熟なトマトがあるから
この値を処理するには、BFSナビゲーションが完了した後にゼロ値を検索する必要があります.
BFSが終わってからまだ0が残っていれば、熟したトマトがあるかどうかを意味します.
このように異なる方向の1がque
box
に入る1は徐々に増加する.
さらに探索できる場所がなければ、que
はすべて空になり、BFS探索は終了する.
2 D配列を繰り返して、最後のボックスを決定します.
0が存在する場合は、-1を出力して戻ります.
トマトが熟していることを確認したときque
は、1から始まるので、0から計算を開始するために値を出力する.
そして熟したトマトがなかったらcount
を生成するとともに、box
という変数を用いて直接フィルタリングすることができる.zero_test
をfalseに初期化し、zero_test
が最初に作成されると、0が1つある場合、true処理が行われる.box
が既に作成されているがfalseである場合、このボックスには成熟したトマトがないことを示すため、0を直接印刷して戻ります.
TMI
ハンバーガーにトマトが嫌いな人はいますか?
ハンバーガーのトマトはパイナップルピザみたい...
コード#コード#
BFSの使用
import java.util.*;
import java.io.*;
public class Main {
static int dirX[] = {0, 0, -1, 1};
static int dirY[] = {-1, 1, 0, 0};
static int box[][];
static boolean visit[][];
static Queue<Node> que = new LinkedList<>();
static int N, M;
static int now_x, now_y;
static int count = 0;
private static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
boolean zero_test = false;
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
box = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++) {
int num = Integer.parseInt(st.nextToken());
if(num == 1) {
que.offer(new Node(j, i));
}
else if(num == 0) {
zero_test = true;
}
box[i][j] = num;
}
}
if(zero_test == false) {
System.out.println(0);
return;
}
while( !que.isEmpty() ) {
BFS(que.size());
count++;
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(box[i][j]== 0) {
System.out.println(-1);
return;
}
}
}
System.out.println(count -1);
}
static void BFS(int size) {
while( size-- >0 ) {
Node node = que.poll();
for(int i=0; i<4; i++) {
now_x = node.x + dirX[i];
now_y = node.y + dirY[i];
if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 ) {
que.offer(new Node(now_x, now_y));
visit[now_y][now_x] = true;
box[now_y][now_x] = 1;
}
}
}
}
private static boolean Range_check() {
return (now_x >= 0 && now_y >= 0 && now_x < M && now_y < N);
}
}
Reference
この問題について([Java]伯俊7576号[トマト]ジャワ), 我々は、より多くの情報をここで見つけました
https://velog.io/@lifeisbeautiful/Java-백준-7576번-토마토-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
熟したトマトは時々両側にある.
つまり、箱の中には1がたくさんあります.これが私たちが解決しなければならない問題の核心です.
成熟したトマトを同時に散布してこそ、最小限の日数を見つけることができる.
そのためDFSは非常に困難であり,BFSを用いて問題を解決する必要がある.
BFSを使用するため、キューを作成し、x、y座標値のノードオブジェクトを作成します.
私たちは初めて箱
box
の並びを作り、1が現れるとすぐにque
に入れました.こうしてBFSの閲覧を1の位置で開始する.
アクション
ボックスの範囲に入ります.アクセスはありません.ボックスは0です.
if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 )
条件を満たす価格はque
に追加されます.その後
visit
をtrue値に、アクセスしたボックスを1に変更します.ここで1に変えた理由は、後で-1に未熟なトマトがあるから
この値を処理するには、BFSナビゲーションが完了した後にゼロ値を検索する必要があります.
BFSが終わってからまだ0が残っていれば、熟したトマトがあるかどうかを意味します.
このように異なる方向の1が
que
box
に入る1は徐々に増加する.さらに探索できる場所がなければ、
que
はすべて空になり、BFS探索は終了する.2 D配列を繰り返して、最後のボックスを決定します.
0が存在する場合は、-1を出力して戻ります.
トマトが熟していることを確認したとき
que
は、1から始まるので、0から計算を開始するために値を出力する.そして熟したトマトがなかったら
count
を生成するとともに、box
という変数を用いて直接フィルタリングすることができる.zero_test
をfalseに初期化し、zero_test
が最初に作成されると、0が1つある場合、true処理が行われる.box
が既に作成されているがfalseである場合、このボックスには成熟したトマトがないことを示すため、0を直接印刷して戻ります.TMI
ハンバーガーにトマトが嫌いな人はいますか?
ハンバーガーのトマトはパイナップルピザみたい...
コード#コード#
BFSの使用
import java.util.*;
import java.io.*;
public class Main {
static int dirX[] = {0, 0, -1, 1};
static int dirY[] = {-1, 1, 0, 0};
static int box[][];
static boolean visit[][];
static Queue<Node> que = new LinkedList<>();
static int N, M;
static int now_x, now_y;
static int count = 0;
private static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
boolean zero_test = false;
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
box = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++) {
int num = Integer.parseInt(st.nextToken());
if(num == 1) {
que.offer(new Node(j, i));
}
else if(num == 0) {
zero_test = true;
}
box[i][j] = num;
}
}
if(zero_test == false) {
System.out.println(0);
return;
}
while( !que.isEmpty() ) {
BFS(que.size());
count++;
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(box[i][j]== 0) {
System.out.println(-1);
return;
}
}
}
System.out.println(count -1);
}
static void BFS(int size) {
while( size-- >0 ) {
Node node = que.poll();
for(int i=0; i<4; i++) {
now_x = node.x + dirX[i];
now_y = node.y + dirY[i];
if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 ) {
que.offer(new Node(now_x, now_y));
visit[now_y][now_x] = true;
box[now_y][now_x] = 1;
}
}
}
}
private static boolean Range_check() {
return (now_x >= 0 && now_y >= 0 && now_x < M && now_y < N);
}
}
Reference
この問題について([Java]伯俊7576号[トマト]ジャワ), 我々は、より多くの情報をここで見つけました
https://velog.io/@lifeisbeautiful/Java-백준-7576번-토마토-자바
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import java.util.*;
import java.io.*;
public class Main {
static int dirX[] = {0, 0, -1, 1};
static int dirY[] = {-1, 1, 0, 0};
static int box[][];
static boolean visit[][];
static Queue<Node> que = new LinkedList<>();
static int N, M;
static int now_x, now_y;
static int count = 0;
private static class Node {
int x;
int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
boolean zero_test = false;
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); // 가로
N = Integer.parseInt(st.nextToken()); // 세로
box = new int[N][M];
visit = new boolean[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=0; j<M; j++) {
int num = Integer.parseInt(st.nextToken());
if(num == 1) {
que.offer(new Node(j, i));
}
else if(num == 0) {
zero_test = true;
}
box[i][j] = num;
}
}
if(zero_test == false) {
System.out.println(0);
return;
}
while( !que.isEmpty() ) {
BFS(que.size());
count++;
}
for(int i=0; i<N; i++) {
for(int j=0; j<M; j++) {
if(box[i][j]== 0) {
System.out.println(-1);
return;
}
}
}
System.out.println(count -1);
}
static void BFS(int size) {
while( size-- >0 ) {
Node node = que.poll();
for(int i=0; i<4; i++) {
now_x = node.x + dirX[i];
now_y = node.y + dirY[i];
if( Range_check() && visit[now_y][now_x] == false && box[now_y][now_x] == 0 ) {
que.offer(new Node(now_x, now_y));
visit[now_y][now_x] = true;
box[now_y][now_x] = 1;
}
}
}
}
private static boolean Range_check() {
return (now_x >= 0 && now_y >= 0 && now_x < M && now_y < N);
}
}
Reference
この問題について([Java]伯俊7576号[トマト]ジャワ), 我々は、より多くの情報をここで見つけました https://velog.io/@lifeisbeautiful/Java-백준-7576번-토마토-자바テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol