주사위 굴리기
링크
풀이
주사위 도면에 번호를 표시해놓고 그 번호가 동,서,남,북 으로 이동할때 어떻게 변화하나를 통해 각각 방향으로 이동할때의
인덱스 변화를 알 수 있었다.
각 방향으로 회전시켜주고 나머지 것들을 처리해줬다.
입력을 지도의 세로 n 가로 m 주사위의 위치 x,y 명령 수 k 를 받는다고 해서
cin » n » m » x » y » k ;
했는데
입력 데이터에 함정이 숨어져 있었다..;
x가 행번호도 y가 열번호이다..
cin » n » m » y » x » k ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <vector>
using namespace std;
vector<int> data(7);//인덱스에 따른 면 -->1:아래 2:앞 3:왼쪽 4:오른쪽 5:위 6:뒤
int n,m;
void cal(int val){
vector<int> temp=data;
switch (val) {
case 1:
temp[1]=data[4];
temp[3]=data[1];
temp[4]=data[5];
temp[5]=data[3];
break;
case 2:
temp[1]=data[3];
temp[3]=data[5];
temp[4]=data[1];
temp[5]=data[4];
break;
case 3:
temp[1]=data[6];
temp[2]=data[1];
temp[5]=data[2];
temp[6]=data[5];
break;
default:
temp[1]=data[2];
temp[2]=data[5];
temp[5]=data[6];
temp[6]=data[1];
break;
}
data=temp;
}
int dy[]={0,0,0,-1,1},dx[]={0,1,-1,0,0};
int main(){
int y,x,k;
cin >> n >> m >> y >> x >> k;
vector<vector<int>> map(n);
vector<int> order(k);
for(int i=0;i<n;i++){
map[i].resize(m,0);
for(int j=0;j<m;j++)
cin >> map[i][j];
}
for(int i=0;i<k;i++)
cin >> order[i];
int ny=0,nx=0;
for(int i=0;i<k;i++){ //동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
ny=y+dy[order[i]];
nx=x+dx[order[i]];
if(ny< 0 || nx < 0 || ny>=n || nx>=m) continue;
cal(order[i]);
if(map[ny][nx]==0)
map[ny][nx]=data[1];
else{
data[1]=map[ny][nx];
map[ny][nx]=0;
}
cout <<data[5]<<'\n';
y=ny;x=nx;
}
}