본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1063 킹

by 까망 하르방 2021. 2. 26.
반응형

출처https://www.acmicpc.net/problem/1063

 Input 

A1 A2 5

B

L

LB

RB

LT

 

 Output 

A1

A2

① 주어진 명령에 따라 킹의 다음 이동 지점 확인

② 체스판을 벗어나는지 확인

    → 벗어난다면 해당 명령 무시

③ 돌맹이가 있는지 확인

    → 돌맹이가 존재한다면 돌맹이를 킹과 같은 방향으로 이동 가능한지 확인

        → 돌맹이가 체스판을 벗어나는 경우 해당 명령어 무시

 


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
 
string dir[] = { "R", "L", "B", "T", "RT", "LT", "RB", "LB"};
int dx[] = {0, 0, -1, 1, 1, 1, -1, -1};
int dy[] = {1, -1, 0, 0, 1, -1, 1, -1};
int N, kingX, kingY, stoneX, stoneY;
int nextKingX, nextKingY, nextStoneX, nextStoneY;
 
bool isCrushStone(int kx, int ky, int sx, int sy){
    if(kx == sx && ky == sy) return true;
    return false;
}
 
bool isRange(int x, int y) {
    if(x < 1 || x > 8 || y < 1 || y > 8) return false;
    return true;
}
 
void moveKing(string command) {
    // 명령에 맞는 방향으로 이동
    for (int i = 0; i < 8; i++) {
        if (command == dir[i]) {
            nextKingX = kingX + dx[i];
            nextKingY = kingY + dy[i];
 
            // 체스판을 벗어나는지 확인
            if (!isRange(nextKingX, nextKingY))
                return;
 
            // 돌맹이와 부딪히는지 확인
            if(isCrushStone(nextKingX, nextKingY, stoneX, stoneY)){
                nextStoneX = stoneX + dx[i];
                nextStoneY = stoneY + dy[i];
                
                if (!isRange(nextStoneX, nextStoneY))
                    return;
                    
                stoneX = nextStoneX;
                stoneY = nextStoneY;
            }
 
            kingX = nextKingX;
            kingY = nextKingY;
            return;
        }
    }
}
 
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    string kingPosition, stonePosition, command;
    cin >> kingPosition >> stonePosition >> N;
 
    kingX = kingPosition[1] - '0'; kingY = kingPosition[0] - 'A' + 1;
    stoneX = stonePosition[1] - '0'; stoneY = stonePosition[0] - 'A' + 1;
 
    while(N--){
        cin >> command;
        moveKing(command);
    }
    
    cout << (char)('A' + kingY - 1) << kingX << '\n';
    cout << (char)('A' + stoneY - 1) << stoneX;
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 10994 별 찍기 - 19  (0) 2021.02.26
[BOJ] 백준 1405 미친 로봇  (0) 2021.02.26
[BOJ] 백준 3985 롤 케이크  (0) 2021.02.26
[BOJ] 백준 1173 운동  (0) 2021.02.26
[BOJ] 백준 2580 스도쿠  (0) 2021.02.26

댓글