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
구현 문제이다. 나 같은 경우는 아래와 같이 풀었다.
1. (북·남), (서·동)으로 움직일 때 양옆은 생각 안 해도 된다.
2. (북·남) 움직일 때의 함수 하나 만들고 (서·동) 움직일 때 함수를 따로 만들어 준다.
3. 북 또는 남으로 움직일 때 x 좌푯값을 갱신해주고 x가 board를 초과하면 주사위를 굴리지 않는다.
4. 서 또는 동으로 움직일 때 y 좌푯값을 갱신해주고 y가 board를 초과하면 주사위를 굴리지 않는다.
5. x, y 둘 다 board를 초과하지 않는다면 주사위를 굴리고 조건대로 값을 넣는다.
#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<int>
#define F first
#define S second
using namespace std;
int dice[4][3],board[21][21],x,y,n,m;
bool UpDownMove(int move){
int UD = 1;
if(move == 3) UD *= -1;
if(x + UD < 0 || x + UD >= n) return false;
x += UD;
int temp = dice[3][1];
if(UD < 0){
dice[3][1] = dice[0][1];
dice[0][1] = dice[1][1];
dice[1][1] = dice[2][1];
dice[2][1] = temp;
}
else{
dice[3][1] = dice[2][1];
dice[2][1] = dice[1][1];
dice[1][1] = dice[0][1];
dice[0][1] = temp;
}
if(board[x][y] != 0){
dice[3][1] = board[x][y];
board[x][y] = 0;
}
else if(board[x][y] == 0) board[x][y] = dice[3][1];
return true;
}
bool LeftRightMove(int move){
int LR = 1;
if(move == 2) LR *= -1;
if(y + LR < 0 || y + LR >= m) return false;
y += LR;
int temp = dice[3][1];
if(LR < 0){
dice[3][1] = dice[1][0];
dice[1][0] = dice[1][1];
dice[1][1] = dice[1][2];
dice[1][2] = temp;
}
else{
dice[3][1] = dice[1][2];
dice[1][2] = dice[1][1];
dice[1][1] = dice[1][0];
dice[1][0] = temp;
}
if(board[x][y] != 0){
dice[3][1] = board[x][y];
board[x][y] = 0;
}
else if(board[x][y] == 0) board[x][y] = dice[3][1];
return true;
}
int main() {
ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int k,move;
cin >> n >> m >> x >> y >> k;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cin >> board[i][j];
}
for(int i=0;i<k;i++){
bool check = true;
cin >> move;
if(move == 3 || move == 4) check = UpDownMove(move);
else check = LeftRightMove(move);
if(check) cout << dice[1][1] << "\n";
}
}
'baekjoon' 카테고리의 다른 글
15684번 사다리 조작 (0) | 2022.04.03 |
---|---|
15685번 드래곤 커브 (0) | 2022.04.01 |
7662번 이중 우선순위 큐 (0) | 2022.03.29 |
17404번 RGB거리 2 (0) | 2022.03.27 |
2887번 행성 터널 (0) | 2022.03.27 |