코테 공부

[BFS] 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유( 백준 17129번, 자바)

DaEun_ 2023. 2. 10. 16:13

 

17129번: 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 (acmicpc.net)

 

17129번: 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유

첫째 줄에 정보섬 2층의 크기 n과 m이 주어진다. (1 ≤ n,m ≤ 3000, 4 ≤ n×m ≤ 9×106) 이후 n행 m열에 걸쳐 0, 1, 2, 3, 4, 5로만 구성된 Ai,j가 주어진다. Ai,j와 Ai,j+1사이에 공백은 주어지지 않는다. 2,

www.acmicpc.net

 

 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int[] dx= {0,1,0,-1};
	static int[] dy= {1,0,-1,0};
	static boolean[][] visit;
	static int n,m;
	static Queue<int[] > q;
	static char[][] c;
	static StringBuilder sb;
	
	public static void main(String[] args) throws Exception{
		
		Scanner sc=new Scanner(System.in);
		
		n=sc.nextInt();
		m=sc.nextInt();
		
		q=new LinkedList<>();
		visit=new boolean[n][m];
		sb=new StringBuilder("");
		c=new char[n][m];
		for(int i=0;i<n;i++) {
			String s=sc.next();
			c[i]=s.toCharArray();
		}
		
		for(int i=0;i<n;i++) {
			for(int j=0;j<m;j++) {
				if(c[i][j]=='2') bfs(i,j,1);
			}
		}
		if(sb.toString().equals("")) sb.append("NIE");
		System.out.println(sb.toString());
	}
	
	static void bfs(int a, int b, int cc) {
		q.add(new int[] {a,b,cc});
		
		while(!q.isEmpty()) {
			int[] x=q.poll();
			
			for(int i=0;i<4;i++) {
				int nx=x[0]+dx[i];
				int ny=x[1]+dy[i];
				
				
				if(nx<0 || nx>=n || ny<0 || ny>=m  || visit[nx][ny] || c[nx][ny]=='1') continue;
				
				if(c[nx][ny]=='3'|| c[nx][ny]=='4'|| c[nx][ny]=='5') {
					sb.append("TAK\n");
					sb.append(x[2]);
					return;
				}
				visit[nx][ny]=true;
				q.add(new int[] {nx,ny,x[2]+1});
				
			}
		}
	}

}