[백준] 13460 - 구슬 탈출2 (java)
13460번: 구슬 탈출 2 첫 번째 줄에는 보드의 세로, 가로 크기를 의미하는 두 정수 N, M (3 ≤ N, M ≤ 10)이 주어진다. 다음 N개의 줄에 보드의 모양을 나타내는 길이 M의 문자열이 주어진다. 이 문자열
dwc04112.tistory.com
static boolean[][][][] visited;
파란구슬 위치에 따른 빨간구슬 위치를 방문처리하여 방문한 좌표는 이동하지 않게 하였다.
private static void play() {
while(!queue.isEmpty()){
Node temp = queue.remove();
if(temp.count==10) break;
visited[temp.redR][temp.redC][temp.blueR][temp.blueC] = true;
... 생략 ...
if(!visited[data.redR][data.redC][data.blueR][data.blueC])
queue.add(new Node(data.redR, data.redC, data.blueR, data.blueC, temp.count + 1));
}
}
이전글에서 말한 구멍에 들어갈 시 -1좌표가 아닌 구멍 좌표를 넣는 과정에서 if문을 잘못 사용하여 틀렸다...
전체코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class B13460Re {
static int N,M;
static char[][] Board;
static int[][] D = {{-1,0},{1,0},{0,-1},{0,1}};
static boolean[][][][] visited;
static Queue<Node> queue = new LinkedList<>();
static int res = -1;
static int goalRow = 0;
static int goalCol = 0;
static boolean blueGoal = false;
static boolean redGoal = false;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
Board = new char[N+1][M+1];
visited = new boolean[10][10][10][10];
for (int i = 0; i < N; i++) {
Board[i] = br.readLine().toCharArray();
}
int rRow=0,rCol=0,bRow=0,bCol=0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if(Board[i][j] == 'R') {
Board[i][j] = '.';
rRow = i;
rCol = j;
}else if(Board[i][j] == 'B') {
Board[i][j] = '.';
bRow = i;
bCol = j;
}else if(Board[i][j] == 'O'){
goalRow = i;
goalCol = j;
}
}
}
visited[rRow][rCol][bRow][bCol] = true;
queue.add(new Node(rRow,rCol,bRow,bCol,0));
play();
}
private static void play() {
while(!queue.isEmpty()){
Node temp = queue.remove();
if(temp.count==10) break;
visited[temp.redR][temp.redC][temp.blueR][temp.blueC] = true;
for (int i = 0; i < 4; i++) {
if(goalRow == temp.blueR && goalCol == temp.blueC) continue;
if(goalRow == temp.redR && goalCol == temp.redC) continue;
blueGoal = false;
redGoal = false;
// i 순서대로 상 하 좌 우
// {{-1,0},{1,0},{0,-1},{0,1}};
Node data;
if(i==0){
// 순서정하기
if(temp.redR < temp.blueR) {
data = redMove(temp , i);
data = blueMove(data , i);
}else{
data = blueMove(temp , i);
data = redMove(data , i);
}
}else if(i==1){
if(temp.redR < temp.blueR) {
data = blueMove(temp , i);
data = redMove(data , i);
}else{
data = redMove(temp , i);
data = blueMove(data , i);
}
}else if(i==2){
if(temp.redC < temp.blueC) {
data = redMove(temp , i);
data = blueMove(data , i);
}else{
data = blueMove(temp , i);
data = redMove(data , i);
}
}else {
if(temp.redC < temp.blueC) {
data = blueMove(temp , i);
data = redMove(data , i);
}else{
data = redMove(temp , i);
data = blueMove(data , i);
}
}
if(redGoal && !blueGoal){
if(res==-1) res = temp.count+1;
else if(res > (temp.count+1)) res = temp.count+1;
}
if(!visited[data.redR][data.redC][data.blueR][data.blueC])
queue.add(new Node(data.redR, data.redC, data.blueR, data.blueC, temp.count + 1));
}
}
System.out.println(res);
}
//빨간구슬 굴리기
private static Node redMove(Node node , int i) {
int nr = node.redR + D[i][0];
int nc = node.redC + D[i][1];
if(Board[nr][nc] == '#') return node;
if(Board[nr][nc] == 'O') {
redGoal = true;
return new Node(nr,nc,node.blueR,node.blueC, node.count);
}
if(nr == node.blueR && nc == node.blueC) return node;
return redMove(new Node(nr,nc,node.blueR,node.blueC, node.count),i);
}
//파란구슬 굴리기
private static Node blueMove(Node node , int i) {
int nr = node.blueR + D[i][0];
int nc = node.blueC + D[i][1];
if(Board[nr][nc] == '#') return node;
if(Board[nr][nc] == 'O') {
blueGoal = true;
return new Node(node.redR, node.redC, nr,nc, node.count);
}
if(nr == node.redR && nc == node.redC) return node;
return blueMove(new Node(node.redR, node.redC, nr,nc, node.count),i);
}
static class Node{
int redR,redC;
int blueR, blueC;
int count;
Node(int rr, int rc, int br, int bc, int c){
redR = rr;
redC = rc;
blueR = br;
blueC = bc;
count = c;
}
}
}
'연습문제 > JAVA' 카테고리의 다른 글
[백준] 2225 - 합분해 (java) (2) | 2022.09.21 |
---|---|
[백준] 9095 - 1,2,3더하기 (java) (0) | 2022.09.20 |
[백준] 13460 - 구슬 탈출2 (java) (0) | 2022.09.19 |
[백준] 2294 - 동전 2 (java) (0) | 2022.09.14 |
[백준] 11052 - 카드 구매하기 (java) (0) | 2022.09.14 |