백준문제풀이
백준 문제 14499번 주사위 굴리기 문제풀이 c++
노가다 김씨
2022. 4. 10. 10:12
https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지
www.acmicpc.net
문제해석
먼저 전역 변수로 dice를 선언해주었다 순서는 어떻게 하든 상관없지만 나는 앞 위 뒤 바닥 왼 오 순서대로 작성하였다.
현재 주사위의 위치와 방향이 주어지면 방향에 맞게 그 다음의 위치로 주사위를 돌려주고(turn)
다음 그 위치의 지도에 0인가 아닌가에 따라 문제에 설명 되어진 대로 구현한 move함수를 구현하였다.
참고로 난 주사위 바닥면이 dice[3] 이기 때문에 지도로 부터 dice[3]에 복사받거나 dice[3]에서 지도로 복사하였다.
그 후 현재위치를 업데이트하고 주사위의 윗면을 출력하고 종료했다.
참고로 난 주사위의 윗면이 dice[1]이다.
또한 방향에 맞게 주사위를 돌려주는 turn함수를 구현하였다.
turn함수는 딱히 설명할게 없는게 그냥 dice를 담을 tmp배열을 선언해주고 노가다로 turn 함수를 구현하였다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void turn(int d);
void move(int cy, int cx, int d);
bool inside(int ny,int nx);
int dice[6]={0,0,0,0,0,0};//앞 위 뒤 바닥 왼 오
int dy[5]={0,0,0,-1,1};
int dx[5]={0,1,-1,0,0};
int a[20][20];
int n,m,x,y,k;
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin>>n>>m>>y>>x>>k;
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
cin>>a[i][j];
}
}
for(int i=0; i<k; i++)
{
int d;
cin>>d;
move(y,x,d);
}
}
void turn(int d){
int tmp[6];
if(d==1)
{
tmp[3]=dice[5];
tmp[5]=dice[1];
tmp[1]=dice[4];
tmp[4]=dice[3];
tmp[0]=dice[0];
tmp[2]=dice[2];
}
else if(d==2)
{
tmp[1]=dice[5];
tmp[4]=dice[1];
tmp[3]=dice[4];
tmp[5]=dice[3];
tmp[0]=dice[0];
tmp[2]=dice[2];
}
else if(d==3)
{
tmp[1]=dice[0];
tmp[2]=dice[1];
tmp[3]=dice[2];
tmp[0]=dice[3];
tmp[4]=dice[4];
tmp[5]=dice[5];
}
else if(d==4)
{
tmp[3]=dice[0];
tmp[0]=dice[1];
tmp[1]=dice[2];
tmp[2]=dice[3];
tmp[4]=dice[4];
tmp[5]=dice[5];
}
for(int i=0; i<6; i++)
{
dice[i]=tmp[i];
}
}
void move(int cy, int cx, int d){
for(int i=1; i<=4; i++)
{
if(d==i)
{
int ny=cy+dy[i];
int nx=cx+dx[i];
if(inside(ny,nx))
{
turn(d);
if(a[ny][nx]==0)
{
a[ny][nx]=dice[3];
}
else
{
dice[3]=a[ny][nx];
a[ny][nx]=0;
}
y=ny; x=nx;
cout<<dice[1]<<"\n";
}
}
}
}
bool inside(int ny,int nx){
if(0<=ny&&ny<n&&0<=nx&&nx<m)
{
return true;
}
else
{
return false;
}
}