알고리즘/문제풀이

[시뮬레이션] 탈주범 검거

lipnus 2018. 10. 20. 22:44
반응형

[모의 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