본문 바로가기

BOJ

BOJ 1986 체스

백준 BOJ 체스 C++ 

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

 

1) 풀면서 정.말.로 다 해보는 거 맞아? 하는 의문이 정말 많이 들었는데 정말 '브루트 포스'가 맞았다..

2) 시키는 대로 조건 설정 해주면 된다. 나는 Queen, Knight의 좌표를 벡터에 넣어서 차례대로 말을 움직였다.

3) [Queen:1 / Knight:2 / Pawn:3 / Queen 이동 가능:4 / Knight 이동 가능:5] 설정하여 

    마지막에 map의 값이 0인 것만 카운트해서 출력한다.

 
#include <iostream>
#include <vector>
using namespace std;

int N, M;
int map[1005][1005];

struct info{
    int x, y;
};
vector <info> q;
vector <info> k;

int qx[8]={-1,-1,-1,0,0,1,1,1};
int qy[8]={-1,0,1,-1,1,-1,0,1};
int kx[8]={-2,-2,-1,-1,1,1,2,2};
int ky[8]={-1,1,-2,2,-2,2,-1,1};

void solve(){
    //Q
    for(int i=0; i<q.size(); i++){
        int x = q[i].x;
        int y = q[i].y;

        for(int j=0; j<8; j++){
            int nx = x + qx[j];
            int ny = y + qy[j];

            while(1){
                if(!(0<nx && nx<=N && 0<ny && ny<=M)) break;
                if(map[nx][ny]==2 || map[nx][ny]==3) break;

                if(map[nx][ny]==0) map[nx][ny]=4;
                nx += qx[j];
                ny += qy[j];
            }
        }
    }

    //K
    for(int i=0; i<k.size(); i++){
        int x = k[i].x;
        int y = k[i].y;
        
        for(int j=0; j<8; j++){
            int nx = x + kx[j];
            int ny = y + ky[j];

            if(0<nx && nx<=N && 0<ny && ny<=M){
                if(map[nx][ny]==0) map[nx][ny]=5;
            }
        }
    }

}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> N >> M;
    
    int Q, K, P, x, y;

    cin >> Q; // Queen
    for(int i=0; i<Q; i++){
        cin >> x >> y;
        map[x][y] = 1;
        q.push_back();
    }
    cin >> K; // Knight
    for(int i=0; i<K; i++){
        cin >> x >> y;
        map[x][y] = 2;
        k.push_back();
    }
    cin >> P; // Pawn
    for(int i=0; i<P; i++){
        cin >> x >> y;
        map[x][y] = 3;
    }

    solve();

    int ans = 0;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=M; j++)
            if(map[i][j]==0) ans++;

    cout << ans << '\n';

    return 0;
}

 

'BOJ' 카테고리의 다른 글

BOJ 2151 거울 설치  (0) 2020.06.10
BOJ 1600 말이 되고픈 원숭이  (0) 2020.06.05
BOJ 2565 전깃줄  (0) 2020.05.22
BOJ 1461 도서관  (0) 2020.05.21
BOJ 1517 버블 소트  (0) 2020.05.19