※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts