코딩공작소

[백준]킹 본문

알고리즘/시뮬레이션

[백준]킹

안잡아모찌 2019. 8. 8. 13:49

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

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는 행을 상징한다. 열은 가장 왼쪽 열이 A이고, 가장 오른쪽 열이 H까지 이고, 행은 가장 아래가 1이고 가장 위가 8이다. 예를 들어, 왼쪽 아래 코너는 A1이고, 그 오른쪽 칸은 B1이다. 킹은 다음과 같이 움직일 수 있다. R : 한 칸 오른쪽으로 L : 한 칸

www.acmicpc.net

 

간단한 시뮬레이션 문제였고, 문자열이 섞여있어서 좀 짜증났지만 구현은 간단했다.

그냥 문제조건에 맞게 코딩해주면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
 
int king_r, king_c, s_r, s_c, N;
queue<int> q;
int dr[] = { 0,0,-1,1,1,1,-1,-1 }, dc[] = { 1,-1,0,0,1,-1,1,-1 }; //R,L,B,T,RT,LT,RB,LB
 
void solve() {
    while (!q.empty()) {
        int k = q.front();
        q.pop();
        
        int nr = king_r + dr[k], nc = king_c + dc[k];
        if (nr < 1 || nc < 1 || nr > 8 || nc > 8continue//킹의 범위검사
        if (nr == s_r && nc == s_c) {
            //돌과 겹치는 경우
            int nnr = s_r + dr[k], nnc = s_c + dc[k]; //돌을 다음으로 이동
            if (nnr < 1 || nnc < 1 || nnr > 8 || nnc > 8)continue; //돌이 범위를 벗어나면 패스
            king_r = nr, king_c = nc, s_r = nnr, s_c = nnc;//모두이동
        }
        else {
            //안겹치는 경우
            king_r = nr, king_c = nc;//이동
        }
    }
}
 
int main()
{    
    char King[3], Stone[3];
    cin >> King >> Stone >> N;
    king_r = King[1- 48, king_c = King[0- 64;
    s_r = Stone[1- 48, s_c = Stone[0- 64;
    
    for (int i = 0; i < N; i++) {
        char dir[3];
        cin >> dir;
        if (strcmp(dir, "R"== 0) { q.push(0); }
        else if (strcmp(dir, "L"== 0) { q.push(1); }
        else if (strcmp(dir, "B"== 0) { q.push(2); }
        else if (strcmp(dir, "T"== 0) { q.push(3); }
        else if (strcmp(dir, "RT"== 0) { q.push(4); }
        else if (strcmp(dir, "LT"== 0) { q.push(5); }
        else if (strcmp(dir, "RB"== 0) { q.push(6); }
        else if (strcmp(dir, "LB"== 0) { q.push(7); }
    }
 
    solve();
    char a[5];
    a[0= char(int(king_c) + 64);
    a[1= char(int(king_r) + 48);
    a[2= char(int(s_c) + 64);
    a[3= char(int(s_r) + 48);
    printf("%c%c\n%c%c\n", a[0], a[1], a[2], a[3]);
    return 0;
}
cs

'알고리즘 > 시뮬레이션' 카테고리의 다른 글

[백준]미로만들기  (1) 2019.08.23
[SWEA]미생물격리  (0) 2019.08.17
[백준]보물  (0) 2019.08.06
[백준]큐빙  (1) 2019.07.29
[백준]이차원배열과 계산  (0) 2019.07.21