지나공 : 지식을 나누는 공간

[백준 1063번] 킹 _C++_풀이 본문

Algorithm/백준

[백준 1063번] 킹 _C++_풀이

해리리_ 2021. 2. 24. 18:14

www.acmicpc.net/problem/1063

 

1063번: 킹

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

www.acmicpc.net

 

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <stdio.h>
#include <vector>
using namespace std;

int map[8][8];
// r, l, b, t, rt, lt, rb, lb
int dx[8] = {0, 0, +1, -1, -1, -1, +1, +1};
int dy[8] = {+1, -1, 0, 0, +1, -1, +1, -1};
char inputKy, inputSy;
int inputKx, inputSx, n;
vector<string> moves;
int main() {
	scanf("%c%d %c%d %d", &inputKy, &inputKx, &inputSy, &inputSx, &n);
	int kx = 8- inputKx; int ky = inputKy - 'A';
	int sx = 8 - inputSx; int sy = inputSy - 'A';

	for (int i = 0; i < n; i++) {
		string str; cin >> str;
		moves.push_back(str);
	}
	//이동시키기
	for (int m = 0; m < n; m++) {
		string move = moves[m];
		int i = 0;
		if (move == "R") {

		}
		else if (move == "L") {
			i += 1;
		}
		else if (move == "B") {
			i += 2;
		}
		else if (move == "T") {
			i += 3;
		}
		else if (move == "RT") {
			i += 4;
		}
		else if (move == "LT") {
			i += 5;
		}
		else if (move == "RB") {
			i += 6;
		}
		else {
			i += 7;
		}
		int nx = kx + dx[i];
		int ny = ky + dy[i];
		
		//king을 옮겨보고나서 못 옮길 상황이면 건너뛰기
		if (nx < 0 || nx > 7 || ny < 0 || ny > 7 ) {
			continue;
		}
		//king을 옮긴 뒤 보니까 돌이랑 같이 있다면?
		if (nx == sx && ny == sy) {
			int nsx = sx + dx[i];
			int nsy = sy + dy[i];
			//돌을 옮겻더니 밖으로 나간다면 건너뛰기
			if (nsx < 0 || nsx >7 || nsy < 0 || nsy >7) {
				continue;
			}
			else {
				//돌 옮기기
				sx = nsx; sy = nsy;
			}
		}
		//king과 돌 모두 건너뛰어지지 않았다면 king 옮기기
		kx = nx; ky = ny;
	}
	printf("%c%d\n", 'A' + ky, 8 - kx);
	printf("%c%d", 'A' + sy, 8 - sx);
	return 0;
}

 

문제 이해를 잘 못하면 나처럼 삽질하게 된다.

주의할 점 두 가지만 정리하자면,

 

1. king이 움직이고 나서 돌의 위치랑 같아지면 그 때 돌을 움직여야 한다.

 

2. king이 움직인 뒤의 좌표가 체스판 밖이라면 그땐 돌이고 뭐고 continue 해버리기 & king이 움직이고 난 뒤의 좌표는 괜찮은데 돌을 움직이고 난 뒤의 좌표가 체스판 밖이라면 그땐 king도 움직이지 말고 continue.

 

2가 좀 헷갈렸다. 킹이든 돌이든 둘다 이동은 맨 마지막에 하는 게 좋겠다. 

둘 다 이동시킬 거 다 시켜본 다음에 둘 다 체스판 밖이 아닐 때에 킹과 돌을 각각 이동시켜야 한다. 

728x90
Comments