[伯俊](Java)14499-サイコロを投げる
質問リンク
https://www.acmicpc.net/problem/14499
問題を解く
問題を読んでいるうちに頭が咲いたと思った.値を置き換える方法でサイコロの移動に近づいた.特にx,y値の範囲設定はちょっと特殊です.x値ですが、範囲は縦...!ああ...もっと詳しく質問を読みましょう
問題を説明するのに長い時間がかかり、実施が速い.
誰もが同じ論理を使っているので、そのうちの1つを置いてください.
南へ移動するとき
サイコロを上、下、正面、後ろ、右側、左側に置きます.
右、左の数字は.
正面->下->後ろ、後ろ->上->正面を面移動します.
temp値で置き換えました.
この過程でdown(底面)の値が変化すると.
地図タイルの値をvalChangeという方法で判断し、地図タイルの値をコピーします.
public static void valChange(){
//지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로
//지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다.
if(map[startx][starty]!=0){
down = map[startx][starty];
map[startx][starty]=0;
}else{
map[startx][starty] = down;
}
}
スイッチドアに入る前に、現在位置で移動可能かどうかを判断します. if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){
return;
}
すべてのプロセスで、up(上)の値はStringBuilderに格納され、繰り返し文の終了時に出力されます.コード#コード#
import java.util.*;
public class Main {
static int n;
static int m;
static int[][] map;
static int starty;
static int startx;
static StringBuilder sb = new StringBuilder();
/**
* 2
* 4 1 3
* 5
* 6
*/
static int up = 0; // 위 (1)
static int down = 0; // 아래 (6)
static int forward = 0; //정면 (5)
static int back = 0; //뒤 (2)
static int right = 0; //우측 (3)
static int left = 0; //좌측 (4)
//동 서 북 남
static int[] diry = {0, 0, -1, 1};
static int[] dirx = {1, -1, 0, 0};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
startx = sc.nextInt(); //세로
starty = sc.nextInt(); //가로
int num = sc.nextInt();
map = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = sc.nextInt();
}
}
for (int i = 0; i < num; i++) {
roll(startx, starty, sc.nextInt());
}
System.out.print(sb);
}
public static void roll(int y, int x, int pos) {
//pos 동 서 북 남
if(!(y + diry[pos - 1]>=0 && y + diry[pos - 1]<n && x + dirx[pos - 1]>=0 && x + dirx[pos - 1]<m)){
return;
}
//이동
startx = y + diry[pos - 1];
starty = x + dirx[pos - 1];
int temp = 0;
int temp2 =0;
int temp3 =0;
switch (pos) {
//동 -> 우측
case 1:
//right -> down
temp = down;
down = right;
valChange();
//down -> left
temp2 = left;
left = temp;//down
//left -> up
temp3 = up;
up = temp2; //left
//up -> right
right = temp3;//up
//forward -> forward
//back -> back
break;
//서
case 2:
//forward -> forward
//back -> back
//left -> down
temp = down;
down = left;
valChange();
//down -> right
temp2 = right;
right = temp;
//right -> up
temp3 = up;
up = temp2;
//up -> left
left = temp3;
break;
//북
case 3:
//left -> left
//right -> right;
//back -> down
temp = down;
down = back;
valChange();
//down -> forward
temp2 = forward;
forward = temp;
//forward -> up
temp3 = up;
up = temp2;
//up -> back
back = temp3;
break;
//남
case 4:
//left -> left
//right -> right;
//forward -> down
temp = down;
down = forward;
valChange();
//down -> back
temp2 = back;
back = temp;
//back -> up
temp3 = up;
up = temp2;
//up -> forward
forward = temp3;
break;
}
sb.append(up+"\n");
}
public static void valChange(){
//지도의 값이 0이 아니면 down(바닥면)에 값을 복사하고, 지도의 값은 0으로
//지도의 값이 0이면 down(바닥면)에 있는 값을 지도에 복사한다.
if(map[startx][starty]!=0){
down = map[startx][starty];
map[startx][starty]=0;
}else{
map[startx][starty] = down;
}
}
}
Reference
この問題について([伯俊](Java)14499-サイコロを投げる), 我々は、より多くの情報をここで見つけました https://velog.io/@courage331/백준Java-14499-주사위-굴리기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol