코테 공부
[DFS]주사위 굴리기2(23288번, 자바)
DaEun_
2023. 1. 12. 14:28
23288번: 주사위 굴리기 2 (acmicpc.net)
23288번: 주사위 굴리기 2
크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼
www.acmicpc.net
1. 주사위 회전 j(direction)
2. dfs를 통해 점수 획득 dfs(nx,ny)
3. 바닥 면 값과 지도 값 비교를 통해 다음 이동 방향 결정 direct(nx,ny)
import java.util.*;
public class Main {
static int[] dx= {0,1,0,-1};
static int[] dy= {1,0,-1,0};
static int N, M, K;
static int[][] map;
static int[] dice;
static int count=0; //C 값
static int answer=0;
static int direction=0; //0:동, 1:남 2:서 3:북
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
M=sc.nextInt();
K=sc.nextInt();
boolean[][] visit=new boolean[N+1][M+1];
map=new int[N+1][M+1];
for(int i=1;i<=N;i++) {
for(int j=1;j<=M;j++) {
map[i][j]=sc.nextInt();
}
}
dice=new int[6];
dice[0]=2;
dice[1]=4;
dice[2]=1;//윗면
dice[3]=3;
dice[4]=5;
dice[5]=6;//아랫면
//시작 위치
int x=1;
int y=1;
for(int i=0;i<K;i++) {
count=0;
visit=new boolean[N+1][M+1];
//이동 가능 공간 없으면 방향 반대로
if(x+dx[direction]<=0 || y+dy[direction]<=0 ||x+dx[direction]>N || y+dy[direction]>M) direction=(direction+2)%4;
j(direction);
x=x+dx[direction];
y=y+dy[direction];
dfs(x,y,visit);
direct(x,y);
answer+=sum(x,y);
}
System.out.println(answer);
}
//동서남북으로 이동 가능 칸의 개수 구하기
static void dfs(int x, int y,boolean[][] visit) {
visit[x][y]=true;
count++;
for(int i=0;i<4;i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=0 || nx>N || ny<=0 || ny>M|| visit[nx][ny]|| map[x][y]!=map[nx][ny]) continue;
dfs(nx,ny,visit);
}
}
//주사위 돌리기
static void j(int d) {
int temp=dice[2];
switch(d) {
case 0:
dice[2]=dice[1];
dice[1]=dice[5];
dice[5]=dice[3];
dice[3]=temp;
break;
case 1:
dice[2]=dice[0];
dice[0]=dice[5];
dice[5]=dice[4];
dice[4]=temp;
break;
case 2:
dice[2]=dice[3];
dice[3]=dice[5];
dice[5]=dice[1];
dice[1]=temp;
break;
case 3:
dice[2]=dice[4];
dice[4]=dice[5];
dice[5]=dice[0];
dice[0]=temp;
break;
}
}
//이동방향 리턴
static int direct(int x, int y) {
if(map[x][y]<dice[5]) direction=(direction+1)%4;
else if(map[x][y]>dice[5]) direction=(direction+3)%4;
return direction;
}
//B*C 결과 출력
static int sum(int x, int y) {
int B=count;
return map[x][y]*B;
}
}