Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 1261. 알고스팟 본문

acmicpc

[BAEKJOON] 1261. 알고스팟

코드와이 2021. 4. 12. 17:38

 

문제링크

www.acmicpc.net/problem/1261

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

 

package acmicpc.Gold4;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class 알고스팟 {
	
	static int r, c;
	static int[][] arr;
	
	static class Point{
		int x;
		int y;
		int cnt;
		
		public Point(int x, int y, int cnt) {
			super();
			this.x = x;
			this.y = y;
			this.cnt = cnt;
		}
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		c = Integer.parseInt(st.nextToken());
		r = Integer.parseInt(st.nextToken());
		
		arr = new int[r][c];
		
		for(int i = 0 ; i < r ; i++) {
			char[] crr = br.readLine().toCharArray();
			for(int j = 0 ; j < c ; j++) {
				arr[i][j] = crr[j] - '0';
			}
		}
		if(r + c == 2) System.out.println(arr[r-1][c-1]);
		else go();
		
	}
	
	static int[] dr = {-1, 1, 0, 0};
	static int[] dc = {0, 0, -1, 1};
	
	private static void go() {
		Queue<Point> queue = new LinkedList<Point>();
		queue.add(new Point(0,0,0));
		
		int[][] cntArr = new int[r][c];
		for(int i = 0 ; i < r ; i++) {
			Arrays.fill(cntArr[i], 987654321);
		}
		
		while(!queue.isEmpty()) {
			Point q = queue.poll();
			
			int x = q.x;
			int y = q.y;
			int cnt = q.cnt;
			
			for(int d = 0 ; d < 4 ; d++) {
				int nr = x + dr[d];
				int nc = y + dc[d];
				
				if(check(nr,nc)) {
					if(arr[nr][nc] == 1 && cntArr[nr][nc] > cnt + 1) {
						cntArr[nr][nc] = cnt + 1;
						queue.add(new Point(nr, nc, cnt + 1));
					} else if(arr[nr][nc] == 0 && cntArr[nr][nc] > cnt) {
						cntArr[nr][nc] = cnt;
						queue.add(new Point(nr, nc, cnt));
					}
				}
			}
		}
		System.out.println(cntArr[r-1][c-1]);
	}
	
	private static boolean check(int x, int y) {
		
		if(x < 0 || y < 0 || x == r || y == c) return false;
		return true;
	}
}

'acmicpc' 카테고리의 다른 글

[BAEKJOON] 1010. 다리놓기  (0) 2021.04.13
[BAEKJOON] 1238. 파티  (0) 2021.04.12
[BAEKJOON] 1916. 최소비용 구하기  (0) 2021.04.12
[BAEKJOON] 10844. 쉬운 계단 수  (0) 2021.04.06
[BAEKJOON] 1912. 연속합  (0) 2021.04.05