알고리즘 문제풀이/백준

[백준/BOJ] 1063번 킹 (C++)

노력의천재 2021. 10. 1. 16:55

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

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

크게 어렵지 않은 구현 문제이다. 다만 주의할 점이 있는데, 첫 번째는 예를들어 좌표가 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";
}