※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26006번 문제인 K-Queen이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26006
26006번: K-Queen
재헌이는 생일 선물로 크기가 $N \times N$인 체스판과 백색 킹 하나, 흑색 퀸 $100\ 000$개를 받았다. 킹은 8방향(상하좌우 및 대각선)으로 한 칸씩 이동할 수 있고, 퀸은 같은 행, 열, 대각선에 있는 상
www.acmicpc.net
킹이 주어진 위치를 중심으로 하는 3x3의 칸들에 대하여 상대의 퀸들이 공격할 수 있는 영역인지를 각각 확인해 문제를 해결하자. 이를 계산할 때 서로 다른 두 퀸이 서로의 경로를 막고 있는지의 여부는 신경쓰지 않아도 됨을 관찰하자. (그 퀸을 뚫고 닿을 칸들은 그 막은 퀸을 움직여서 어쨌든 닿을 수 있을 것이기 때문이다.)
주어진 킹의 위치가 체스판의 가장자리여서 일부 방향으로는 움직일 수 없는 경우가 발생할 수 있음에 유의하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N, K, R, C;
bool board[3][3];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K >> R >> C;
if (R == 1) board[0][0] = board[0][1] = board[0][2] = 1;
else if (R == N) board[2][0] = board[2][1] = board[2][2] = 1;
if (C == 1) board[0][0] = board[1][0] = board[2][0] = 1;
else if (C == N) board[0][2] = board[1][2] = board[2][2] = 1;
while (K--) {
int r, c; cin >> r >> c;
if (r == R - 1) board[0][0] = board[0][1] = board[0][2] = 1;
else if (r == R) board[1][0] = board[1][1] = board[1][2] = 1;
else if (r == R + 1) board[2][0] = board[2][1] = board[2][2] = 1;
if (c == C - 1) board[0][0] = board[1][0] = board[2][0] = 1;
else if (c == C) board[0][1] = board[1][1] = board[2][1] = 1;
else if (c == C + 1) board[0][2] = board[1][2] = board[2][2] = 1;
if (r - c == R - C - 2) board[0][2] = 1;
else if (r - c == R - C - 1) board[0][1] = board[1][2] = 1;
else if (r - c == R - C) board[0][0] = board[1][1] = board[2][2] = 1;
else if (r - c == R - C + 1) board[1][0] = board[2][1] = 1;
else if (r - c == R - C + 2) board[2][0] = 1;
if (r + c == R + C - 2) board[0][0] = 1;
else if (r + c == R + C - 1) board[1][0] = board[0][1] = 1;
else if (r + c == R + C) board[2][0] = board[1][1] = board[0][2] = 1;
else if (r + c == R + C + 1) board[2][1] = board[1][2] = 1;
else if (r + c == R + C + 2) board[2][2] = 1;
}
if (board[1][1]) {
if (board[0][0] && board[0][1] && board[0][2] && board[1][0] && board[1][2] && board[2][0] && board[2][1] && board[2][2]) cout << "CHECKMATE";
else cout << "CHECK";
}
else if (board[0][0] && board[0][1] && board[0][2] && board[1][0] && board[1][2] && board[2][0] && board[2][1] && board[2][2]) cout << "STALEMATE";
else cout << "NONE";
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26863 // C++] Absolutely Flat (0) | 2022.12.26 |
---|---|
[BOJ 26008 // C++] 해시 해킹 (0) | 2022.12.26 |
[BOJ 15001 // C++] Frog Leaps (0) | 2022.12.26 |
[BOJ 26773 // C++] Deski kontratakują (0) | 2022.12.26 |
[BOJ 9443 // C++] Arrangement of Contest (0) | 2022.12.26 |