반응형
https://www.acmicpc.net/problem/13459
쉬운문제 였는데 실수 했던게.. 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 |