More actions
imported>Unknown No edit summary |
(Repair batch-0001 pages from live compare) |
||
| Line 15: | Line 15: | ||
const int WHITE = 2; | const int WHITE = 2; | ||
char board | char board[8][8]; | ||
int whereSide(int y, int x) | int whereSide(int y, int x) | ||
{ | { | ||
if (board | if (board[y][x] >= 'a' && board[y][x] <= 'z') | ||
return BLACK; | return BLACK; | ||
else if (board | else if (board[y][x] >= 'A' && board[y][x] <= 'Z') | ||
return WHITE; | return WHITE; | ||
else | else | ||
| Line 38: | Line 38: | ||
if (side == WHITE) | if (side == WHITE) | ||
{ | { | ||
if (isInBoard(y - 1, x - 1) && board | if (isInBoard(y - 1, x - 1) && board[y - 1][x - 1] == 'p') | ||
return true; | return true; | ||
else if (isInBoard(y - 1, x + 1) && board | else if (isInBoard(y - 1, x + 1) && board[y - 1][x + 1] == 'p') | ||
return true; | return true; | ||
} | } | ||
else | else | ||
{ | { | ||
if (isInBoard(y + 1, x - 1) && board | if (isInBoard(y + 1, x - 1) && board[y + 1][x - 1] == 'P') | ||
return true; | return true; | ||
else if (isInBoard(y + 1, x - 1) && board | else if (isInBoard(y + 1, x - 1) && board[y + 1][x + 1] == 'P') | ||
return true; | return true; | ||
} | } | ||
| Line 55: | Line 55: | ||
bool RookCheck(int y, int x, int side) | bool RookCheck(int y, int x, int side) | ||
{ | { | ||
int move | int move[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; | ||
int i, k; | int i, k; | ||
for (k = 0; k < 4; k++) | for (k = 0; k < 4; k++) | ||
{ | { | ||
for (i = 1; i <= 7 && isInBoard(y + i * move | for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++) | ||
{ | { | ||
if (board | if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY) | ||
continue; | continue; | ||
else if (whereSide(y + i * move | else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side) | ||
break; | break; | ||
else | else | ||
{ | { | ||
if (toupper(board | if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'R') | ||
return true; | return true; | ||
else | else | ||
| Line 79: | Line 79: | ||
bool BishopCheck(int y, int x, int side) | bool BishopCheck(int y, int x, int side) | ||
{ | { | ||
int move | int move[4][2] = {{-1, 1}, {1, 1}, {1, -1}, {-1, -1}}; | ||
int i, k; | int i, k; | ||
for (k = 0; k < 4; k++) | for (k = 0; k < 4; k++) | ||
{ | { | ||
for (i = 1; i <= 7 && isInBoard(y + i * move | for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++) | ||
{ | { | ||
if (board | if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY) | ||
continue; | continue; | ||
else if (whereSide(y + i * move | else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side) | ||
break; | break; | ||
else | else | ||
{ | { | ||
if (toupper(board | if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'B') | ||
return true; | return true; | ||
else | else | ||
| Line 104: | Line 104: | ||
bool QueenCheck(int y, int x, int side) | bool QueenCheck(int y, int x, int side) | ||
{ | { | ||
int move | int move[8][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 1}, {1, 1}, {1, -1}, {-1, -1}}; | ||
int i, k; | int i, k; | ||
for (k = 0; k < 8; k++) | for (k = 0; k < 8; k++) | ||
{ | { | ||
for (i = 1; i <= 7 && isInBoard(y + i * move | for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++) | ||
{ | { | ||
if (board | if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY) | ||
continue; | continue; | ||
else if (whereSide(y + i * move | else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side) | ||
break; | break; | ||
else | else | ||
{ | { | ||
if (toupper(board | if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'Q') | ||
return true; | return true; | ||
else | else | ||
| Line 128: | Line 128: | ||
bool KingCheck(int y, int x, int side) | bool KingCheck(int y, int x, int side) | ||
{ | { | ||
int move | int move[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}}; | ||
int k; | int k; | ||
for (k = 0; k < 8; k++) | for (k = 0; k < 8; k++) | ||
{ | { | ||
if (isInBoard(y + move | if (isInBoard(y + move[k][0], x + move[k][1])) | ||
{ | { | ||
if (whereSide(y + move | if (whereSide(y + move[k][0], x + move[k][1]) != side && toupper(board[y + move[k][0]][x + move[k][1]]) == 'K') | ||
return true; | return true; | ||
} | } | ||
| Line 143: | Line 143: | ||
bool KnightCheck(int y, int x, int side) | bool KnightCheck(int y, int x, int side) | ||
{ | { | ||
int move | int move[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}}; | ||
int k; | int k; | ||
for (k = 0; k < 8; k++) | for (k = 0; k < 8; k++) | ||
{ | { | ||
if (isInBoard(y + move | if (isInBoard(y + move[k][0], x + move[k][1])) | ||
{ | { | ||
if (whereSide(y + move | if (whereSide(y + move[k][0], x + move[k][1]) != side && toupper(board[y + move[k][0]][x + move[k][1]]) == 'N') | ||
return true; | return true; | ||
} | } | ||
| Line 186: | Line 186: | ||
isEmpty = true; | isEmpty = true; | ||
for (i = 0; i < 8; i++) | for (i = 0; i < 8; i++) | ||
cin >> board | cin >> board[i]; | ||
for (i = 0; i < 8; i++) | for (i = 0; i < 8; i++) | ||
for (j = 0; j < 8; j++) | for (j = 0; j < 8; j++) | ||
{ | { | ||
if (board | if (board[i][j] == '.') | ||
board | board[i][j] = EMPTY; | ||
if (whereSide(i, j) != EMPTY) | if (whereSide(i, j) != EMPTY) | ||
{ | { | ||
| Line 204: | Line 204: | ||
for (j = 0; j < 8; j++) | for (j = 0; j < 8; j++) | ||
{ | { | ||
if ((board | if ((board[i][j] == 'K' || board[i][j] == 'k') && isInCheck(i, j, whereSide(i, j))) | ||
{ | { | ||
| Line 230: | Line 230: | ||
---- | ---- | ||
[[CheckTheCheck]] | [[CheckTheCheck]] | ||
Latest revision as of 23:56, 26 March 2026
소감
2005/03/13 Accepted 0:00.010 64 깔끔하게 짜려고 했는데 의외로 지저분해졌다. 처음엔 모든 말의 위치를 기준으로 검사를 하려고 했는데 굳이 그럴필요 없이 왕의 위치를 기준으로 검사를 하면 더 간단할것 같아 그렇게 짰다. toupper를 쓰려면 ctype.h를 include해야한다. 나중에 리팩토링을 해봐야겠다.
소스
#include <iostream>
using namespace std;
#include <ctype.h>
const int EMPTY = 0;
const int BLACK = 1;
const int WHITE = 2;
char board[8][8];
int whereSide(int y, int x)
{
if (board[y][x] >= 'a' && board[y][x] <= 'z')
return BLACK;
else if (board[y][x] >= 'A' && board[y][x] <= 'Z')
return WHITE;
else
return EMPTY;
}
bool isInBoard(int y, int x)
{
if (y >= 0 && y < 8 && x >= 0 && x < 8)
return true;
return false;
}
bool PawnCheck(int y, int x, int side)
{
if (side == WHITE)
{
if (isInBoard(y - 1, x - 1) && board[y - 1][x - 1] == 'p')
return true;
else if (isInBoard(y - 1, x + 1) && board[y - 1][x + 1] == 'p')
return true;
}
else
{
if (isInBoard(y + 1, x - 1) && board[y + 1][x - 1] == 'P')
return true;
else if (isInBoard(y + 1, x - 1) && board[y + 1][x + 1] == 'P')
return true;
}
return false;
}
bool RookCheck(int y, int x, int side)
{
int move[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int i, k;
for (k = 0; k < 4; k++)
{
for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++)
{
if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY)
continue;
else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side)
break;
else
{
if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'R')
return true;
else
break;
}
}
}
return false;
}
bool BishopCheck(int y, int x, int side)
{
int move[4][2] = {{-1, 1}, {1, 1}, {1, -1}, {-1, -1}};
int i, k;
for (k = 0; k < 4; k++)
{
for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++)
{
if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY)
continue;
else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side)
break;
else
{
if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'B')
return true;
else
break;
}
}
}
return false;
}
bool QueenCheck(int y, int x, int side)
{
int move[8][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, 1}, {1, 1}, {1, -1}, {-1, -1}};
int i, k;
for (k = 0; k < 8; k++)
{
for (i = 1; i <= 7 && isInBoard(y + i * move[k][0], x + i * move[k][1]); i++)
{
if (board[y + i * move[k][0]][x + i * move[k][1]] == EMPTY)
continue;
else if (whereSide(y + i * move[k][0], x + i * move[k][1]) == side)
break;
else
{
if (toupper(board[y + i * move[k][0]][x + i * move[k][1]]) == 'Q')
return true;
else
break;
}
}
}
return false;
}
bool KingCheck(int y, int x, int side)
{
int move[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
int k;
for (k = 0; k < 8; k++)
{
if (isInBoard(y + move[k][0], x + move[k][1]))
{
if (whereSide(y + move[k][0], x + move[k][1]) != side && toupper(board[y + move[k][0]][x + move[k][1]]) == 'K')
return true;
}
}
return false;
}
bool KnightCheck(int y, int x, int side)
{
int move[8][2] = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}};
int k;
for (k = 0; k < 8; k++)
{
if (isInBoard(y + move[k][0], x + move[k][1]))
{
if (whereSide(y + move[k][0], x + move[k][1]) != side && toupper(board[y + move[k][0]][x + move[k][1]]) == 'N')
return true;
}
}
return false;
}
bool isInCheck(int y, int x, int side)
{
if (PawnCheck(y, x, side))
return true;
if (RookCheck(y, x, side))
return true;
if (BishopCheck(y, x, side))
return true;
if (QueenCheck(y, x, side))
return true;
if (KingCheck(y, x, side))
return true;
if (KnightCheck(y, x, side))
return true;
return false;
}
int main()
{
int i, j;
bool isEmpty;
int gameCnt = 0;
while (true)
{
gameCnt++;
isEmpty = true;
for (i = 0; i < 8; i++)
cin >> board[i];
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
if (board[i][j] == '.')
board[i][j] = EMPTY;
if (whereSide(i, j) != EMPTY)
{
isEmpty = false;
}
}
if (isEmpty)
break;
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
{
if ((board[i][j] == 'K' || board[i][j] == 'k') && isInCheck(i, j, whereSide(i, j)))
{
if (whereSide(i, j) == WHITE)
{
cout << "Game #" << gameCnt << ": white king is in check." << endl;
i = 8;
break;;
}
else
{
cout << "Game #" << gameCnt << ": black king is in check." << endl;
i = 8;
break;;
}
}
}
if (i == 8)
cout << "Game #" << gameCnt << ": no king is in check." << endl;
}
return 0;
}