지나공 : 지식을 나누는 공간
[백준 1063번] 킹 _C++_풀이 본문
코드
#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
'Algorithm > 백준' 카테고리의 다른 글
[백준 2805번] 나무자르기_C++ 이분탐색 & DP (0) | 2021.02.25 |
---|---|
[백준] 7571_점 모으기_C++ 풀이, 시간초과 해결하기 (0) | 2021.01.19 |
[백준] 4796번_캠핑 C++ 풀이 (0) | 2021.01.11 |
[백준] 1759_암호 만들기 C++ (0) | 2021.01.11 |
Comments