반응형
[모의 SW 역량테스트] 탈주범 검거
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq
package com.company;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class PrisonBreak {
//상하좌우
static int[] dy = {-1,1,0,0};
static int[] dx = {0,0,-1,1};
static int N,M;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T;
int[] startPoint = new int[2];
int L;
T = sc.nextInt();
for(int test_case=1; test_case<=T; test_case++){
N=sc.nextInt();
M=sc.nextInt();
startPoint[0] = sc.nextInt();
startPoint[1] = sc.nextInt();
L = sc.nextInt();
int[][] map = new int[N][M];
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
map[i][j] = sc.nextInt();
}
}
System.out.printf("#%d %d\n", test_case, escape(map, startPoint, L));
}//for(test-case)
}
static int escape(int[][] map, int[] startPoint, int L){
boolean[][] visited = new boolean[N][M];
visited[startPoint[0]][startPoint[1]] = true;
Queue<int[]> queue = new LinkedList<>();
queue.offer(startPoint);
int count=1;
for(int time=1; time<L; time++) {
//현재 큐에 있는 것들을 빼서 돌린다.
int qSize = queue.size();
for (int i = 0; i < qSize; i++) {
int[] position = queue.poll();
//상하좌우 탐색
for(int j=0; j<4; j++){
int[] newPos = { position[0]+dy[j], position[1]+dx[j] };
if( toMove( map[position[0]][position[1]], j ) ){ //현재파이프에서 이동가능한 방향인지
if(isInside(newPos[0],newPos[1])){ //맵 바깥을 벗어나는지
if( fromMove(map[newPos[0]][newPos[1]], j)){ //이동할 곳으로 연결이 되어있는지
if(!visited[newPos[0]][newPos[1]]){ //방문했던 곳인지 확인
visited[newPos[0]][newPos[1]] = true;
queue.offer(newPos);
count++;
}//if
}//if
}//if
}//if
}//for - j
}//for - i
}//for(time)
return count;
}
static boolean isInside(int y, int x){
if(-1<y && y<N){
if(-1<x && x<M){
return true;
}
}
return false;
}
//현재 파이프에서 상하좌우(0,1,2,3)이동가능 유무를 반환
static boolean toMove(int pipe, int direction){
if(direction==0){
if(pipe==1 || pipe==2 || pipe==4 || pipe==7) return true;
return false;
}else if(direction==1){
if(pipe==1 || pipe==2 || pipe==5 || pipe==6) return true;
return false;
}else if(direction==2){
if(pipe==1 || pipe==3 || pipe==6 || pipe==7) return true;
return false;
}else if(direction==3){
if(pipe==1 || pipe==3 || pipe==4 || pipe==5) return true;
return false;
}
return true;
}
//다른 파이프에서 상하좌우(0,1,2,3)에서 접근할때의 이동가능 유무를 반환
static boolean fromMove(int pipe, int direction){
if(direction==0){
if(pipe==1 || pipe==2 || pipe==5 || pipe==6) return true;
return false;
}else if(direction==1){
if(pipe==1 || pipe==2 || pipe==4 || pipe==7) return true;
return false;
}else if(direction==2){
if(pipe==1 || pipe==3 || pipe==4 || pipe==5) return true;
return false;
}else if(direction==3){
if(pipe==1 || pipe==3 || pipe==6 || pipe==7) return true;
return false;
}
return true;
}
}
잡았다요놈
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
[순열] 소수찾기 (0) | 2019.01.04 |
---|---|
[DP] 막대기, 최장공통부분수열, knapsack (1) | 2018.10.21 |
[조합(재귀), 완전탐색] 치킨배달 (0) | 2018.10.20 |
[BFS] 탈주범 검거 (0) | 2018.10.20 |
[구현] 경사로문제 (0) | 2018.10.19 |