코테 공부

[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;
	}

}