[swexpert] 1953. 탈주범 검거 (java, bfs)
728x90
반응형
푸는 데 소요시간: 40분
파이프 방향이 위일때는 다음 칸의 파이프가 방향 아래를 포함하고 있으면 된다.
이처럼 다음 칸의 방향이 내 방향의 반대인 숫자를 가지고 있나 체크해주면 된다.
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Pos{
int y,x,type;
public Pos(int y, int x,int type) {
super();
this.y = y;
this.x = x;
this.type=type;
}
}
public class Solution {
static int t,m,n,l;
static int[][] map;
static int[][] pipe={{},{0,1,2,3},{0,1},{2,3},{0,3},{1,3},{1,2},{0,2}};//상하좌우
static int[] xpos= {0,0,-1,1};//상하좌우
static int[] ypos= {-1,1,0,0};
static Queue<Pos> q;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
t=sc.nextInt();
for (int tc = 1; tc <=t; tc++) {
q=new LinkedList<Pos>();
n=sc.nextInt();
m=sc.nextInt();
map=new int[n][m];
int r=sc.nextInt();
int c=sc.nextInt();
l=sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j <m; j++) {
map[i][j]=sc.nextInt();
}
}
q.add(new Pos(r,c,map[r][c]));
map[r][c]=-1;//방문 표시
int answer=1;
int time=1;
while(q.size()!=0) {
int len=q.size();
if(time==l)break;// 도둑이 소요한 시간
for (int i = 0; i < len;i++) {
Pos cur=q.poll();
int y=cur.y;
int x=cur.x;
int type=cur.type;//현재 위치에 존재하는 파이프 종류
// System.out.println("type"+type);
for (int d = 0; d < pipe[type].length; d++) {
//갈 수 있는 방향
int dir=pipe[type][d];//상하좌우를 나타냄
// System.out.println("dir"+dir);
int yy=y+ypos[dir];
int xx=x+xpos[dir];
if(xx<0 || yy<0 || xx>=m || yy>=n)continue;
if(map[yy][xx]==0)continue;//파이프 없어서 못감
if(map[yy][xx]==-1)continue;//방문 된 곳이면 못간다
//이제 다음 칸의 파이프 방향이 맞으면 갈 수 있음
int type2=map[yy][xx];
//상이면 다음칸 방향은 하가 있어야된다.
if(dir==0 && Arrays.binarySearch(pipe[type2],1)<0) {
continue;
}
if(dir==1 && Arrays.binarySearch(pipe[type2],0)<0) {
continue;
}
if(dir==2 && Arrays.binarySearch(pipe[type2],3)<0) {
continue;
}
if(dir==3 && Arrays.binarySearch(pipe[type2],2)<0) {
continue;
}
// 다음칸과 방향이 매치되면 이동 가능
q.add(new Pos(yy,xx,map[yy][xx]));
answer+=1;
map[yy][xx]=-1;
}
}
time++;
}
System.out.printf("#%d %d\n",tc,answer);
}
}
}
728x90
반응형
'swexpert' 카테고리의 다른 글
[swexpert] 5607. 조합 (페르마의 정리, 재귀, java) (0) | 2021.04.19 |
---|---|
[swexpert] 8382. 방향전환 (구현, java) (0) | 2021.04.19 |
[swexpert] 5656. 벽돌깨기 (java, bfs) (0) | 2021.04.14 |
[swexpert] 2819. 격자판의 숫자 이어붙이기 (java,bfs ) (0) | 2021.04.13 |
[swexpert] 3752. 가능한 시험점수 (java, dfs, 완전탐색, 구현) (0) | 2021.04.12 |
TAGS.