-
[백준/BOJ] 1063번 킹 (C++)알고리즘 문제풀이/백준 2021. 10. 1. 16:55
https://www.acmicpc.net/problem/1063
크게 어렵지 않은 구현 문제이다. 다만 주의할 점이 있는데, 첫 번째는 예를들어 좌표가 A1이면 해당 좌표는 맨 왼쪽 아래를 의미한다. 이를 90도 방향으로 회전하면 배열처럼 사용할 수 있는데, 이렇게 하면 킹이 움직이는 방향도 90도 방향으로 회전해서 생각해줘야 한다. 그리고 두 번째는 좌표가 문자로 되어있기 때문에 이동 처리를 할 때는 숫자로 바꿔주고 마지막에 출력할 때는 다시 문자로 바꿔줘야 한다.
#include <iostream> #include <algorithm> using namespace std; int n, kx, ky, sx, sy; int dx[8] = {1, -1, 0, 0, 1, -1, 1, -1}; int dy[8] = {0, 0, -1, 1, 1, 1, -1, -1}; bool check(int dir) { int nkx = kx + dx[dir], nky = ky + dy[dir]; int nsx = sx, nsy = sy; if(nkx < 1 || nkx > 8 || nky < 1 || nky > 8) return false; if(nkx == nsx && nky == nsy) { nsx += dx[dir], nsy += dy[dir]; if(nsx < 1 || nsx > 8 || nsy < 1 || nsy > 8) return false; } kx = nkx, ky = nky; sx = nsx, sy = nsy; return true; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); string k_loc, s_loc, answer = ""; cin >> k_loc >> s_loc >> n; // 좌표를 전부 숫자로 바꿔준다. kx = k_loc[0] - 'A' + 1, ky = k_loc[1] - '1' + 1; sx = s_loc[0] - 'A' + 1, sy = s_loc[1] - '1' + 1; for(int i = 0; i < n; i++) { string op; cin >> op; if(op == "R") { if(!check(0)) continue; } else if(op == "L") { if(!check(1)) continue; } else if(op == "B") { if(!check(2)) continue; } else if(op == "T") { if(!check(3)) continue; } else if(op == "RT") { if(!check(4)) continue; } else if(op == "LT") { if(!check(5)) continue; } else if(op == "RB") { if(!check(6)) continue; } else if(op == "LB") { if(!check(7)) continue; } } // 마지막에 숫자 좌표를 다시 문자로 변환 cout << (char)('A' - 1 + kx) << ky << "\n"; cout << (char)('A' - 1 + sx) << sy << "\n"; }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 3568번 iSharp (C++) (0) 2021.10.10 [백준/BOJ] 2615번 오목 (C++) (0) 2021.10.05 [백준/BOJ] 8979번 올림픽 (C++) (0) 2021.09.30 [백준/BOJ] 2563번 색종이 (C++) (0) 2021.09.26 [백준/BOJ] 1822번 차집합 (C++) (0) 2021.09.26