반응형
출처: 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 |
댓글