본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1986 체스

by 까망 하르방 2021. 2. 26.
반응형

출처: https://www.acmicpc.net/problem/1986

 Input 

4 4

2 1 4 2 4

1 1 2

1 2 3

 

 Output 

6

 

일반 체스와 다른 점은 Pawn은 상대팀의 말을 잡을 수 없기에 공간만 차지하고 있다고 보면 됩니다.

Queen  Knight  Pawn 순으로 위치를 입력받습니다.

움직일 수 있는 Queen과 Knight에 대해 잡을 수 있는 공간을 board[][]에 표시합니다.


#include <iostream>
using namespace std;
 
char board[1002][1002];
int N, M, cnt, answer = 0;
int Q_dx[] = { 0, 0, -1, 1, -1, -1, 1, 1 };
int Q_dy[] = { -1, 1, 0, 0, -1, 1, -1, 1 };
int K_dx[] = { -2, -2, 2, 2, -1, -1, 1, 1 };
int K_dy[] = { -1, 1, -1, 1, -2, 2, -2, 2 };
int nextX, nextY;
 
bool isRange(int x, int y) {
    if (x < 1 || x > N || y < 1 || y > M) return false;
    return true;
}
 
bool checkObstacle(int x, int y) {
    if (board[x][y] == 'Q' || board[x][y] == 'K' || board[x][y] == 'P') return true;
    return false;
}
 
void setBoard(char name, int cnt) {
    int x, y;
    for (int i = 0; i < cnt; i++) {
        cin >> x >> y;
        board[x][y] = name;
    }
}
 
void moveQueen(int x, int y) {
    for (int i = 0; i < 8; i++) {
        nextX = x + Q_dx[i];
        nextY = y + Q_dy[i];
        while (true) {
            if (!isRange(nextX, nextY)) break;
            if (checkObstacle(nextX, nextY)) break;
            board[nextX][nextY] = 'X';
            nextX += Q_dx[i];
            nextY += Q_dy[i];
        }
    }
}
 
void moveKnight(int x, int y) {
        for (int i = 0; i < 8; i++) {
            nextX = x + K_dx[i];
            nextY = y + K_dy[i];
            if (!isRange(nextX, nextY)) continue;
            if (checkObstacle(nextX, nextY)) continue;
            board[nextX][nextY] = 'X';
        }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    cin >> N >> M;
 
    char pin[3] = { 'Q', 'K', 'P' };
    for (int i = 0; i < 3; i++) {
        cin >> cnt;
        setBoard(pin[i], cnt);
    }
 
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            if (board[i][j] == 'Q')
                moveQueen(i, j);
            else if (board[i][j] == 'K')
                moveKnight(i, j);
        }
    }
    
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            if (board[i][j] == 0)
                answer++;
        }
    }
    cout << answer;
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2580 스도쿠  (0) 2021.02.26
[BOJ] 백준 1347 미로 만들기  (0) 2021.02.26
[BOJ] 백준 1331 나이트 투어  (0) 2021.02.26
[BOJ] 백준 1107 리모컨  (0) 2021.02.26
[BOJ] 백준 3048 개미  (0) 2021.02.26

댓글