본문 바로가기

ProgramSoliving

백준 : 13459

반응형

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

 

13459번: 구슬 탈출

첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'

www.acmicpc.net

 

쉬운문제 였는데 실수 했던게.. boolean형 함수를 사용해서 파란공이 실패하면 return false를 한다는 것이다.

 

이게 당연한 건줄 알았지만 생각해보면 그방햐으로 실패해도 다른방향은 성공할수있으니 return false를 날리면안된다.

 

따리서 coninue로 처리해주어서 AC를 받았다.

 

package 삼성;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 구슬탈출 {
	static int T;
	static int N, M;
	static char map[][];

	static class Pair {
		int y;
		int x;

		public Pair(int y, int x) {
			super();
			this.y = y;
			this.x = x;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		Pair R = null;
		Pair B = null;
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		map = new char[N][M];
		for (int i = 0; i < N; i++)
			map[i] = br.readLine().toCharArray();

		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (map[i][j] == 'B') {
					B = new Pair(i, j);
					map[i][j] = '.';
				} else if (map[i][j] == 'R') {
					R = new Pair(i, j);
					map[i][j] = '.';
				}
			}
		}

		if (dfs(0, -1, R, B)) {
			System.out.println(1);
		} else {
			System.out.println(0);
		}
	}

	static int dy[] = { 1, -1, 0, 0 };
	static int dx[] = { 0, 0, 1, -1 };

	public static boolean dfs(int cnt, int pd, Pair R, Pair B) {
		if (cnt == 10) {
			return false;
		}
		Pair copyR = null;
		Pair copyB = null;
		for (int d = 0; d < 4; d++) {
			if (d == pd)
				continue;
			copyR = move(R.y, R.x, d);
			copyB = move(B.y, B.x, d);
//			System.out.println(R.y +" "+R.x);
//			System.out.println(copyR.y +" "+copyR.x);
//			System.out.println(B.y +" "+B.x);
//			System.out.println(copyB.y +" "+copyB.x);
			if (map[copyR.y][copyR.x] == 'O' && map[copyB.y][copyB.x] != 'O') {
				return true;
			} else if (map[copyB.y][copyB.x] == 'O') {
				continue;
			} else if (copyR.y == copyB.y && copyR.x == copyB.x) {
				if (d == 0) {
					if (R.y < B.y) {
						copyR.y -= 1;
					} else {
						copyB.y -= 1;
					}
				} else if (d == 1) {
					if (R.y > B.y) {
						copyR.y += 1;
					} else {
						copyB.y += 1;
					}
				} else if (d == 2) {
					if (R.x < B.x) {
						copyR.x -= 1;
					} else {
						copyB.x -= 1;
					}
				} else if (d == 3) {
					if (R.x > B.x) {
						copyR.x += 1;
					} else {
						copyB.x += 1;
					}
				}
			}

			if (dfs(cnt + 1, d, copyR, copyB))
				return true;
		}

		return false;
	}

	public static Pair move(int y, int x, int d) {
		Pair ball = null;
		int ny, nx;
		while (true) {
			ny = y + dy[d];
			nx = x + dx[d];
			if (map[ny][nx] == 'O') {
				ball = new Pair(ny, nx);
				break;
			} else if (map[ny][nx] == '#') {
				ball = new Pair(y, x);
				break;
			}
			y = ny;
			x = nx;
		}

		return ball;
	}

}
반응형

'ProgramSoliving' 카테고리의 다른 글

백준 : 17090 미로 탈출하기  (0) 2020.05.21
SW아카데미 : 숫자게임  (0) 2020.05.21
백준 : 3678 카탄의 개척자  (0) 2020.05.17
백준 : 1091  (0) 2020.05.17
백준 : 1443 망가진 시계  (0) 2020.05.16