Page 3 of 6
Posted: Thu Sep 20, 2007 9:11 am
by Arashk_kh68
Hi Dear ACMers,
I have coded this two weeks ago and I still get WA for it.
I cant figure out where is the problem, because I got right answer for every testcases i have tested.
Coded in C++:
Code: Select all
// CheckTheCheck.cpp : Defines the entry point for the console application.
// UVA 10196
//#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
char board[8][8];
int caseNum = 1;
int status = 0; // 0 = no king in check. 1 = Black king in check. 2 = White king in check
bool checkTheCheck(int row, int col) {
switch (board[row][col]) {
case 'k': // Black king
if (row > 0) { // check up for rook or queen
for (int i = row - 1; i >= 0; i--) {
if (board[i][col] == 'R' || board[i][col] == 'Q') {
status = 1;
return true;
} else if (board[i][col] != '.') // reached a piece that is not king
break;
}
}
if (row < 7) { // check down for rook or queen
for (int i = row + 1; i <= 7; i++) {
if (board[i][col] == 'R' || board[i][col] == 'Q') {
status = 1;
return true;
} else if (board[i][col] != '.') // reached a piece that is not king
break;
}
}
if (col > 0) { // check left for rook or queen
for (int i = col - 1; i >= 0; i--) {
if (board[row][i] == 'R' || board[row][i] == 'Q') {
status = 1;
return true;
} else if (board[row][i] != '.') // reached a piece that is not king
break;
}
}
if (col < 7) { // check right for rook or queen
for (int i = col + 1; i <= 7; i++) {
if (board[row][i] == 'R' || board[row][i] == 'Q') {
status = 1;
return true;
} else if (board[row][i] != '.') // reached a piece that is not king
break;
}
}
//////////////////////////////// check for bishop or queen
if (row > 0 && col > 0) { // check up left
int temp = (row > col) ? col : row;
for (int i = 1; i <= temp; i++) {
if (board[row - i][col - i] == 'B' || board[row - i][col - i] == 'Q') {
status = 1;
return true;
} else if (board[row - i][col - i] != '.') // reached a piece that is not bishop
break;
}
}
if (row > 0 && col < 7) { // check up right
int temp = (row > 7 - col) ? (7 - col) : row;
for (int i = 1; i <= temp; i++) {
if (board[row - i][col + i] == 'B' || board[row - i][col + i] == 'Q') {
status = 1;
return true;
} else if (board[row - i][col + i] != '.') // reached a piece that is not bishop
break;
}
}
if (row < 7 && col > 0) { // check down left
int temp = (7 - row > col) ? col : (7 - row);
for (int i = 1; i <= temp; i++) {
if (board[row + i][col - i] == 'B' || board[row + i][col - i] == 'Q') {
status = 1;
return true;
} else if (board[row + i][col - i] != '.') // reached a piece that is not bishop
break;
}
}
if (row < 7 && col < 7) { // check down right
int temp = (7 - row > 7 - col) ? (7 - col) : (7 - row);
for (int i = 1; i <= temp; i++) {
if (board[row + i][col + i] == 'B' || board[row + i][col + i] == 'Q') {
status = 1;
return true;
} else if (board[row + i][col + i] != '.') // reached a piece that is not bishop
break;
}
}
///////////////////////// check for pawn
if (row != 7 && col != 0 && board[row + 1][col - 1] == 'P') { // check down right
status = 1;
return true;
}
if (row != 7 && col != 7 && board[row + 1][col + 1] == 'P') { // check down right
status = 1;
return true;
}
//////////////////////// check for knight
/////////////// Up pieces
if (row > 0 && col > 1 && board[row - 1][col - 2] == 'N') {
status = 1;
return true;
}
if (row > 1 && col > 0 && board[row - 2][col - 1] == 'N') {
status = 1;
return true;
}
if (row > 1 && col < 7 && board[row - 2][col + 1] == 'N') {
status = 1;
return true;
}
if (row > 0 && col < 6 && board[row - 1][col + 2] == 'N') {
status = 1;
return true;
}
//////////////// Down pieces
if (row < 7 && col > 1 && board[row + 1][col - 2] == 'N') {
status = 1;
return true;
}
if (row < 6 && col > 0 && board[row + 2][col - 1] == 'N') {
status = 1;
return true;
}
if (row < 6 && col < 7 && board[row + 2][col + 1] == 'N') {
status = 1;
return true;
}
if (row < 7 && col < 6 && board[row + 1][col + 2] == 'N') {
status = 1;
return true;
}
break;
case 'K': // White king
if (row > 0) { // check up for rook or queen
for (int i = row - 1; i >= 0; i--) {
if (board[i][col] == 'r' || board[i][col] == 'q') {
status = 2;
return true;
} else if (board[i][col] != '.') // reached a piece that is not king
break;
}
}
if (row < 7) { // check down for rook or queen
for (int i = row + 1; i <= 7; i++) {
if (board[i][col] == 'r' || board[i][col] == 'q') {
status = 2;
return true;
} else if (board[i][col] != '.') // reached a piece that is not king
break;
}
}
if (col > 0) { // check left for rook or queen
for (int i = col - 1; i >= 0; i--) {
if (board[row][i] == 'r' || board[row][i] == 'q') {
status = 2;
return true;
} else if (board[row][i] != '.') // reached a piece that is not king
break;
}
}
if (col < 7) { // check right for rook or queen
for (int i = col + 1; i <= 7; i++) {
if (board[row][i] == 'r' || board[row][i] == 'q') {
status = 2;
return true;
} else if (board[row][i] != '.') // reached a piece that is not king
break;
}
}
//////////////////////////////// check for bishop and queen
if (row > 0 && col > 0) { // check up left
int temp = (row > col) ? col : row;
for (int i = 1; i <= temp; i++) {
if (board[row - i][col - i] == 'b' || board[row - i][col - i] == 'q') {
status = 2;
return true;
} else if (board[row - i][col - i] != '.') // reached a piece that is not bishop
break;
}
}
if (row > 0 && col < 7) { // check up right
int temp = (row > 7 - col) ? (7 - col) : row;
for (int i = 1; i <= temp; i++) {
if (board[row - i][col + i] == 'b' || board[row - i][col + i] == 'q') {
status = 2;
return true;
} else if (board[row - i][col + i] != '.') // reached a piece that is not bishop
break;
}
}
if (row < 7 && col > 0) { // check down left
int temp = (7 - row > col) ? col : (7 - row);
for (int i = 1; i <= temp; i++) {
if (board[row + i][col - i] == 'b' || board[row + i][col - i] == 'q') {
status = 2;
return true;
} else if (board[row + i][col - i] != '.') // reached a piece that is not bishop
break;
}
}
if (row < 7 && col < 7) { // check down right
int temp = (7 - row > 7 - col) ? (7 - col) : (7 - row);
for (int i = 1; i <= temp; i++) {
if (board[row + i][col + i] == 'b' || board[row + i][col + i] == 'q') {
status = 2;
return true;
} else if (board[row + i][col + i] != '.') // reached a piece that is not bishop
break;
}
}
///////////////////////// check for pawn
if (row != 0 && col != 0 && board[row - 1][col - 1] == 'p') { // check down right
status = 2;
return true;
}
if (row != 0 && col != 7 && board[row - 1][col + 1] == 'p') { // check down right
status = 2;
return true;
}
//////////////////////// check for knight
/////////////// Up pieces
if (row > 0 && col > 1 && board[row - 1][col - 2] == 'n') {
status = 2;
return true;
}
if (row > 1 && col > 0 && board[row - 2][col - 1] == 'n') {
status = 2;
return true;
}
if (row > 1 && col < 7 && board[row - 2][col + 1] == 'n') {
status = 2;
return true;
}
if (row > 0 && col < 6 && board[row - 1][col + 2] == 'n') {
status = 2;
return true;
}
//////////////// Down pieces
if (row < 7 && col > 1 && board[row + 1][col - 2] == 'n') {
status = 2;
return true;
}
if (row < 6 && col > 0 && board[row + 2][col - 1] == 'n') {
status = 2;
return true;
}
if (row < 6 && col < 7 && board[row + 2][col + 1] == 'n') {
status = 2;
return true;
}
if (row < 7 && col < 6 && board[row + 1][col + 2] == 'n') {
status = 2;
return true;
}
break;
}
return false;
}
int main()
{
// ifstream in("CheckTheCheck.in");
bool end = false;
string temp;
while (!end) {
end = true;
status = 0;
for (int i = 0; i < 8; i++) {
// getline(in, temp);
getline(cin, temp);
for (int j = 0; j < 8; j++) {
if ((board[i][j] = temp[j]) != '.')
end = false;
}
}
bool checked = false;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i][j] == 'k' || board[i][j] == 'K') {
checked = checkTheCheck(i, j);
if (checked)
break;
}
}
if (checked)
break;
}
if (end)
break;
if (caseNum > 1)
cout << endl;
switch (status) {
case 0:
cout << "Game #" << caseNum << ": no king is in check.";
break;
case 1:
cout << "Game #" << caseNum << ": black king is in check.";
break;
case 2:
cout << "Game #" << caseNum << ": white king is in check.";
break;
}
// getline(in, temp);
getline(cin, temp);
caseNum++;
}
// cin >> temp;
// in.close();
return 0;
}
Thanks.
Posted: Tue Oct 02, 2007 4:25 pm
by sapnil
I get wrong answer as lik you.
Finally i recode & get Acc.
The code is too long,so is hard to
find bugs.
Thanks
Keep posting
Sapnil
Re: 10196 > Critical input/output PLZ!!.
Posted: Sun Feb 10, 2008 3:46 pm
by jud
several of ur test-cases are illegal. on each board there are 2 kings!
greeez
Re: 10196 - Check The Check
Posted: Tue Jul 01, 2008 8:16 am
by Chirag Chheda
Can someone who has got ACC plz post some more test cases so that i can rectify my error.
Also, I think that the test cases provided by CodeMaker are not il-legal as posted int the above post.
Let me know if i m wrong.
Thanking you in advance.
Waiting for a reply.
Bye
Re: 10196 - Check The Check
Posted: Tue Jul 01, 2008 10:26 am
by jud
here some test cases:
Code: Select all
........
...k....
....P...
........
........
........
.....K..
........
........
...k....
..P.....
........
........
........
.....K..
........
........
...k....
........
........
........
...R....
.....K..
........
........
...k..R.
........
........
........
........
.....K..
........
........
R..k....
........
........
........
........
.....K..
........
........
........
...R....
...k....
........
........
.....K..
........
........
...k....
........
.....B..
........
........
.....K..
........
........
...k....
........
.B......
........
........
.....K..
........
.....B..
........
...k....
........
........
........
.....K..
........
.B......
........
...k....
........
........
........
.....K..
........
........
...k....
........
...p....
........
...R....
.....K..
........
........
...k....
..r.....
.B......
........
........
.....K..
........
........
...k....
........
..N.....
........
........
.....K..
........
........
...k....
...pp...
....N...
........
........
.....K..
........
........
........
........
...k....
........
....p...
.....K..
........
........
........
........
..pk....
.N......
........
.....K..
........
........
........
........
...k.q..
.....N..
........
.....K..
........
........
..N.....
........
...k....
........
........
.....K..
........
........
....N...
........
...k....
........
........
.....K..
........
........
........
.....N..
...k....
........
........
.....K..
........
........
........
.N......
...k....
........
........
.....K..
........
........
q.......
........
...k....
........
....P...
.....K..
........
........
q.......
........
...k....
........
....P.p.
.....K..
........
.....r..
........
........
...k....
........
........
.r...K..
........
........
........
........
...k....
........
........
.....K..
...b....
r......r
........
........
...k....
........
...n....
.....K..
........
K......k
........
........
........
........
........
........
.......b
K......k
........
..p.....
........
........
........
........
.......b
Kp.....k
prn.....
..p.....
........
........
........
........
.......b
K..R...k
........
..p.....
........
........
........
........
.......b
K.pr...k
b....q..
..p..nn.
........
..b.....
........
........
bq.....b
K..RB..k
.....R.P
..p.....
.......Q
........
........
........
.......b
......B.
........
..p.....
........
..Kpk..r
........
........
.......b
......P.
...K.k..
..p.....
........
........
........
........
.......b
........
...K....
pppppppp
..n.n...
........
........
.k......
.......b
........
...K....
pppppppp
........
........
........
k.......
.......b
........
........
...k....
........
.B.R....
........
........
.K......
..k.....
ppp.pppp
........
.R...B..
........
........
PPPPPPPP
K.......
rnbqk.nr
ppp..ppp
....p...
...p....
.bPP....
.....N..
PP..PPPP
RNBQKB.R
........
...k....
....P...
........
........
........
.....K..
........
........
...k....
..P.....
........
........
........
.....K..
........
........
...k....
........
........
........
...R....
.....K..
........
........
...k..R.
........
........
........
........
.....K..
........
........
R..k....
........
........
........
........
.....K..
........
........
........
...R....
...k....
........
........
.....K..
........
........
...k....
........
.....B..
........
........
.....K..
........
........
...k....
........
.B......
........
........
.....K..
........
.....B..
........
...k....
........
........
........
.....K..
........
.B......
........
...k....
........
........
........
.....K..
........
........
...k....
........
...p....
........
...R....
.....K..
........
........
...k....
..r.....
.B......
........
........
.....K..
........
........
...k....
........
..N.....
........
........
.....K..
........
........
...k....
...pp...
....N...
........
........
.....K..
........
........
........
........
...k....
........
........
.....K..
........
........
........
........
..pk....
.N......
........
.....K..
........
........
........
........
...k.q..
.....N..
........
.....K..
........
........
..N.....
........
...k....
........
........
.....K..
........
........
....N...
........
...k....
........
........
.....K..
........
........
........
.....N..
...k....
........
........
.....K..
........
........
........
.N......
...k....
........
........
.....K..
........
........
q.......
........
...k....
........
....P...
.....K..
........
........
q.......
........
...k....
........
....P.p.
.....K..
........
.....r..
........
........
...k....
........
........
.r...K..
........
........
........
........
...k....
........
........
.....K..
...b....
r......r
........
........
...k....
........
...n....
.....K..
........
........
........
........
........
........
........
........
........
Re: 10196 - Check The Check
Posted: Tue Jul 01, 2008 11:32 am
by Chirag Chheda
Thanx a lot frnd.
Ur test cases were really very helpful.
I found my mistake and got ACC.
Re: 10196 - Check The Check
Posted: Thu Jul 24, 2008 5:33 am
by KaDeG
Code removed after ACC. My WA cause was a function checking if a given (x, y) position is in the chess table and i was checking
if (x < 0 || y < 0 || x > 8 || y >
![8)](./images/smilies/icon_cool.gif)
return 0
but should been x >= 8 or y >= 8
Anyway. The test case which made me see this error
was the following...
........
......k.
........
.N......
........
........
........
........
Good luck
Re: 10196 - Check The Check
Posted: Tue Aug 05, 2008 7:52 am
by Obaida
Hi every one please help me i edited my code but still TLE!!!
But why an 8x8 board search will get TLE???
Here is my code:
Code: Select all
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,g=0;
char arr[10][10];
bool CHECK,check,close;
while(1)
{
CHECK=0;check=0,close=1;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++){scanf("%c",&arr[i][j]);if(arr[i][j]!='.')close = 0;}
getchar();
}
if(close)break;
g++;
printf("Game #%d:",g);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(arr[i][j]=='p'){if(arr[i+1][j+1]=='K'||arr[i+1][j-1]=='K'){CHECK = 1;break;}}
else if(arr[i][j]=='P'){if(arr[i-1][j+1]=='k'||arr[i-1][j-1]=='k'){check=1;break;}}
else if(arr[i][j]=='r')
{
for(k=i+1;k<8;k++){if(arr[k][j]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i+1;k<8;k++){if(arr[i][k]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[k][j]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[i][k]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
}
else if(arr[i][j]=='R')
{
for(k=i+1;k<8;k++){if(arr[k][j]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i+1;k<8;k++){if(arr[i][k]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[k][j]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[i][k]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
}
else if(arr[i][j]=='b')
{
for(k=1;k<8-i+1;k++){if(arr[i+k][j+k]=='K'){CHECK = 1;break;}else if(arr[i+k][j+k]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j-k]=='K'){CHECK = 1;break;}else if(arr[i+k][j-k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j+k]=='K'){CHECK = 1;break;}else if(arr[i-k][j+k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j-k]=='K'){CHECK = 1;break;}else if(arr[i-k][j-k]!='.')break;}
}
else if(arr[i][j]=='B')
{
for(k=1;k<8-i+1;k++){if(arr[i+k][j+k]=='k'){check = 1;break;}else if(arr[i+k][j+k]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j-k]=='k'){check = 1;break;}else if(arr[i+k][j-k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j+k]=='k'){check = 1;break;}else if(arr[i-k][j+k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j-k]=='k'){check = 1;break;}else if(arr[i-k][j-k]!='.')break;}
}
else if(arr[i][j]=='q')
{
for(k=i+1;k<8;k++){if(arr[k][j]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i+1;k<8;k++){if(arr[i][k]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[k][j]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[i][k]=='K'){CHECK = 1;break;}else if(arr[k][j]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j+k]=='K'){CHECK = 1;break;}else if(arr[i+k][j+k]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j-k]=='K'){CHECK = 1;break;}else if(arr[i+k][j-k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j+k]=='K'){CHECK = 1;break;}else if(arr[i-k][j+k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j-k]=='K'){CHECK = 1;break;}else if(arr[i-k][j-k]!='.')break;}
}
else if(arr[i][j]=='Q')
{
for(k=i+1;k<8;k++){if(arr[k][j]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i+1;k<8;k++){if(arr[i][k]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[k][j]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=i-1;k>=0;k--){if(arr[i][k]=='k'){check = 1;break;}else if(arr[k][j]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j+k]=='k'){check = 1;break;}else if(arr[i+k][j+k]!='.')break;}
for(k=1;k<8-i+1;k++){if(arr[i+k][j-k]=='k'){check = 1;break;}else if(arr[i+k][j-k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j+k]=='k'){check = 1;break;}else if(arr[i-k][j+k]!='.')break;}
for(k=1;k<=i;k++){if(arr[i-k][j-k]=='k'){check = 1;break;}else if(arr[i-k][j-k]!='.')break;}
}
else if(arr[i][j]=='n')
{
if(arr[i+1][j+2]=='K'||arr[i+1][j-2]=='K'||arr[i-1][j+2]=='K'||arr[i-1][j-2]=='K'){CHECK = 1;break;}
}
else if(arr[i][j]=='N')
{
if(arr[i+1][j+2]=='k'||arr[i+1][j-2]=='k'||arr[i-1][j+2]=='k'||arr[i-1][j-2]=='k'){check = 1;break;}
}
if(CHECK)break;else if(check)break;
}
}
if(CHECK)puts(" white king is in check.");
else if(check)puts(" black king is in check.");
else puts(" no king is in check.");
}
return 0;
}
Re: 10196 - Check The Check
Posted: Fri Aug 22, 2008 3:10 pm
by rtperson
Hi Opu,
Hopefully you've figured this out by now, but the issue here is that getchar() when you set up your board. The judge ain't gonna hit return for you.
Also, I might have missed it, but I don't see how you're checking for an empty board. There's no guarantee that the empty board will be the
last board, and checking the board after the empty one would be an error.
Hope this helps. I still have yet to pass this one, though I haven't yet found the test case that's failing me. Good luck!
Roger
Re: 10196 - Check The Check
Posted: Wed Oct 08, 2008 8:35 am
by stcheung
This problem is mostly a test of how careful you are. With that said, here are couple hints and things to watch out for:
(1) When checking pawn, only check 1 direction, depending on the pawn's color
(2) When checking rook, bishop and queen, remember if there's another piece in between, the king will still be safe
(3) No need to check for king attacking king, because the problem states at most one king will be in check
(4) It might be easier to first locate the king, and then determine whether it's being attacked by another piece. This is in constrast to scanning the board, figuring out what piece you are currently at, and then determining if it's attacking a king.
(5) Instead of a 8x8 char array, create a 12x12 char array instead. You will store the board in the center of course. This will save you a lot of boundary checking code.
In general, the more lines of code you have the more likely you will have bugs. My code is about 150 lines with no "code squeezing" at all. If your code is much longer than that and you keep getting WA, might as well try rewriting it to reduce the room for error.
Re: 10196 - Check The Check
Posted: Mon Apr 20, 2009 10:36 pm
by danielg_ramos
Hi,
I'm really frustrated with this problem.
I've already tested ALL possible positions; i've got all test cases and compared answers with uva toolkit, and my answers are all right..
I dont know why im still getting WA all the time..
Please tell me if the situation bellow is a check:
K.......
.....r..
........
.q......
........
........
........
....k...
As we can see, the white king cant move, so he would loose the game..
But this situation is not mentioned on the problem, so i didnt worked on it.
Please someone give me some help, my code will be posted bellow, so if someone find a case where my problam fails, please tell me.
Code: Select all
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
char board[8][8];
//Retorna 0 se nao tiver fazendo check; retorna 1 se branco tiver fazendo check; retorna 2 se preto tiver fazendo check.
int isMakingCheck(char kind, int xpos, int ypos){
if(kind == 'k'){
return 0;
}
else if(kind == 'K'){
return 0;
}
else if(kind == '.'){
return 0;
}
else if(kind == 'p'){
if(xpos < 7){
if(ypos > 0){
if(board[xpos+1][ypos-1] == 'K')
return 2;
}
if(ypos < 7){
if(board[xpos+1][ypos+1] == 'K')
return 2;
}
}
}
else if(kind == 'P'){
if(xpos > 0){
if(ypos > 0){
if(board[xpos-1][ypos-1] == 'k')
return 1;
}
if(ypos < 7){
if(board[xpos-1][ypos+1] == 'k')
return 1;
}
}
}
else if(kind == 'r'){
for(int i = xpos+1; i < 8; i++){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'K')
return 2;
else
break;
}
for(int i = xpos-1; i >= 0; i--){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'K')
return 2;
else
break;
}
for(int j = ypos+1; j < 8; j++){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'K')
return 2;
else
break;
}
for(int j = ypos-1; j >= 0; j--){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'K')
return 2;
else
break;
}
}
else if(kind == 'R'){
for(int i = xpos+1; i < 8; i++){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'k')
return 1;
else
break;
}
for(int i = xpos-1; i >= 0; i--){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'k')
return 1;
else
break;
}
for(int j = ypos+1; j < 8; j++){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'k')
return 1;
else
break;
}
for(int j = ypos-1; j >= 0; j--){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'k')
return 1;
else
break;
}
}
else if(kind == 'b'){
int i = xpos+1, j = ypos+1;
while(i < 8 && j < 8){
if(board[i][j] == '.'){
i++;
j++;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos-1;
j = ypos+1;
while(i >=0 && j < 8){
if(board[i][j] == '.'){
i--;
j++;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos+1;
j = ypos-1;
while(i < 8 && j >= 0){
if(board[i][j] == '.'){
i++;
j--;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos-1;
j = ypos-1;
while(i >=0 && j >= 0){
if(board[i][j] == '.'){
i--;
j--;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
}
else if(kind == 'B'){
int i = xpos+1, j = ypos+1;
while(i < 8 && j < 8){
if(board[i][j] == '.'){
i++;
j++;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos-1;
j = ypos+1;
while(i >=0 && j < 8){
if(board[i][j] == '.'){
i--;
j++;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos+1;
j = ypos-1;
while(i < 8 && j >= 0){
if(board[i][j] == '.'){
i++;
j--;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos-1;
j = ypos-1;
while(i >=0 && j >= 0){
if(board[i][j] == '.'){
i--;
j--;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
}
else if(kind == 'q'){
for(int i = xpos+1; i < 8; i++){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'K')
return 2;
else
break;
}
for(int i = xpos-1; i >= 0; i--){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'K')
return 2;
else
break;
}
for(int j = ypos+1; j < 8; j++){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'K')
return 2;
else
break;
}
for(int j = ypos-1; j >= 0; j--){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'K')
return 2;
else
break;
}
int i = xpos+1, j = ypos+1;
while(i < 8 && j < 8){
if(board[i][j] == '.'){
i++;
j++;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos-1;
j = ypos+1;
while(i >=0 && j < 8){
if(board[i][j] == '.'){
i--;
j++;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos+1;
j = ypos-1;
while(i < 8 && j >= 0){
if(board[i][j] == '.'){
i++;
j--;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
i = xpos-1;
j = ypos-1;
while(i >=0 && j >= 0){
if(board[i][j] == '.'){
i--;
j--;
continue;
}
else if(board[i][j] == 'K')
return 2;
else
break;
}
}
else if(kind == 'Q'){
for(int i = xpos+1; i < 8; i++){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'k')
return 1;
else
break;
}
for(int i = xpos-1; i >= 0; i--){
if(board[i][ypos] == '.')
continue;
else if(board[i][ypos] == 'k')
return 1;
else
break;
}
for(int j = ypos+1; j < 8; j++){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'k')
return 1;
else
break;
}
for(int j = ypos-1; j >= 0; j--){
if(board[xpos][j] == '.')
continue;
else if(board[xpos][j] == 'k')
return 1;
else
break;
}
int i = xpos+1, j = ypos+1;
while(i < 8 && j < 8){
if(board[i][j] == '.'){
i++;
j++;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos-1;
j = ypos+1;
while(i >=0 && j < 8){
if(board[i][j] == '.'){
i--;
j++;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos+1;
j = ypos-1;
while(i < 8 && j >= 0){
if(board[i][j] == '.'){
i++;
j--;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
i = xpos-1;
j = ypos-1;
while(i >=0 && j >= 0){
if(board[i][j] == '.'){
i--;
j--;
continue;
}
else if(board[i][j] == 'k')
return 1;
else
break;
}
}
else if(kind == 'n'){
if(xpos > 0 && ypos > 1){
if(board[xpos-1][ypos-2] == 'K')
return 2;
}
if(xpos > 1 && ypos > 0){
if(board[xpos-2][ypos-1] == 'K')
return 2;
}
if(xpos > 1 && ypos < 7){
if(board[xpos-2][ypos+1] == 'K')
return 2;
}
if(xpos > 0 && ypos < 6){
if(board[xpos-1][ypos+2] == 'K')
return 2;
}
if(xpos < 7 && ypos > 1){
if(board[xpos+1][ypos-2] == 'K')
return 2;
}
if(xpos < 6 && ypos > 0){
if(board[xpos+2][ypos-1] == 'K')
return 2;
}
if(xpos < 6 && ypos < 7){
if(board[xpos+2][ypos+1] == 'K')
return 2;
}
if(xpos < 7 && ypos < 6){
if(board[xpos+1][ypos+2] == 'K')
return 2;
}
}
else if(kind == 'N'){
if(xpos > 0 && ypos > 1){
if(board[xpos-1][ypos-2] == 'k')
return 1;
}
if(xpos > 1 && ypos > 0){
if(board[xpos-2][ypos-1] == 'k')
return 1;
}
if(xpos > 1 && ypos < 7){
if(board[xpos-2][ypos+1] == 'k')
return 1;
}
if(xpos > 0 && ypos < 6){
if(board[xpos-1][ypos+2] == 'k')
return 1;
}
if(xpos < 7 && ypos > 1){
if(board[xpos+1][ypos-2] == 'k')
return 1;
}
if(xpos < 6 && ypos > 0){
if(board[xpos+2][ypos-1] == 'k')
return 1;
}
if(xpos < 6 && ypos < 7){
if(board[xpos+2][ypos+1] == 'k')
return 1;
}
if(xpos < 7 && ypos < 6){
if(board[xpos+1][ypos+2] == 'k')
return 1;
}
}
}
int main(){
int game = 1;
while(1){
bool empty = true;
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
cin >> board[i][j];
if(board[i][j] != '.')
empty = false;
}
}
if(empty) return 0;
int retorno = 0;
bool whiteMadeCheck = false;
bool blackMadeCheck = false;
for(int i = 0; i < 8; i++){
for(int j = 0; j < 8; j++){
retorno = isMakingCheck(board[i][j], i, j);
if(retorno == 0)
continue;
else if(retorno == 1){
whiteMadeCheck = true;
// cout << "posit: " << i << "," << j << endl;
}
else
blackMadeCheck = true;
}
}
if(whiteMadeCheck){
cout << "Game #" << game++ << ": black king is in check." << endl;
}
else if(blackMadeCheck){
cout << "Game #" << game++ << ": white king is in check." << endl;
}
else {
cout << "Game #" << game++ << ": no king is in check." << endl;
}
}
return 0;
}
I appreciate your help.
Thanks,
Daniel Ramos
Re: 10196 - Check The Check
Posted: Mon Apr 20, 2009 11:34 pm
by Al3x4nd3r
In the first paragraph
A king is in check if it's in a square which is attacked by an oponnet's piece (i.e. it's in square which can be taken by an oponnet's piece in his next move).
i don't know where is my problem too =p
[OFF]
Fosse pelo caminho mais dificil... eu fiz o caminho inverso saindo do rei atras dos inimigos e não dos inimigos para o rei.
[/OFF]
Re: 10196 - Check The Check
Posted: Tue Apr 21, 2009 12:55 am
by danielg_ramos
Hi,
I just got AC!
I simply erased everything and started from the beginning, following some advices from people here...
I was checking if every piece could make a check, instead of taking the king and look if its in check.
Although i got AC, im still angry about my WA with my first implementation. Even its not the very best way, im pretty sure its right..
Anyway, I have to say that the hints said here are really usefull and avoid a lot of waste of time, like using a 12x12 char array..
Thanks,
Daniel Ramos
Re: 10196 - Check The Check
Posted: Sun Apr 26, 2009 10:57 pm
by MoseHas
hi there i'm a student from Taiwan, so my English is not really good for expressing my problem.
i have a big trouble with 10196 cuz i have tested all the testing data that i could find and i still get WA
![:(](./images/smilies/icon_frown.gif)
is there anybody who can give me some advice for my WA code? thx a lot
a very long code orz...275 lines
Code: Select all
#include <stdio.h>
#include <stdlib.h>
struct coordinates
{
int x,y;
}cur;
char chessboard[8][8];
int isWKInCheck(struct coordinates wKing);
int isBKInCheck(struct coordinates bKing);
int main()
{
int cou=1,i,j,wKingCheck,bKingCheck;
while (1)
{
struct coordinates wKing,bKing;//declare
wKing.x=wKing.y=bKing.x=bKing.y=-9;//initialize to -9
for (i=0;i<8;i++) scanf("%s",chessboard[i]);
int end=1;
for (j=0;j<8;j++) for (i=0;i<8;i++) if (chessboard[j][i]!='.')
{
end=0;
break;
}
if (end) break;
for (j=0;j<8;j++) for (i=0;i<8;i++)
{
if (chessboard[j][i]=='K')
{
wKing.x=i;
wKing.y=j;
}
else if (chessboard[j][i]=='k')
{
bKing.x=i;
bKing.y=j;
}
}
wKingCheck=isWKInCheck(wKing);
bKingCheck=isBKInCheck(bKing);
if (wKingCheck) printf("Game #%d: white king is in check.\n",cou);
else if (bKingCheck) printf("Game #%d: black king is in check.\n",cou);
else printf("Game #%d: no king is in check.\n",cou);
cou++;
}
return 0;
}
int isWKInCheck(struct coordinates wKing)
{
cur=wKing;//the first assignment
int _1st_step=0;
while (1)//left of the above
{
--cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q') return 1;
else if (curChar=='p'&&!_1st_step) return 1;//the correct determination of pawns
else if (curChar=='n'||curChar=='r'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
_1st_step++;
}
cur=wKing;//re-assignment
while (1)//the above
{
--cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
_1st_step=0;
while (1)//right of the above
{
--cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q'||(curChar=='p'&&!_1st_step)) return 1;//the correct determination of pawns
else if (curChar=='n'||curChar=='r'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
_1st_step++;
}
cur=wKing;//re-assignment
while (1)//left
{
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//right
{
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//left of the below
{
++cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='p'||curChar=='r'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//the below
{
++cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='r'||curChar=='q') return 1;
else if (curChar=='b'||curChar=='n'||curChar=='p'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
cur=wKing;//re-assignment
while (1)//right of the below
{
++cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='b'||curChar=='q') return 1;
else if (curChar=='n'||curChar=='p'||curChar=='r'||curChar=='k') break;//the enemy's chesses but not the correct one
else if (curChar<83&&curChar>65) break;//own chesses
}
struct coordinates N[8];//assume that the knight are on one of the 8 situation
N[0].x=wKing.x-2;//initialize
N[0].y=wKing.y-1;
N[1].x=wKing.x-1;
N[1].y=wKing.y-2;
N[2].x=wKing.x+2;
N[2].y=wKing.y-1;
N[3].x=wKing.x+1;
N[3].y=wKing.y-2;
N[4].x=wKing.x-2;
N[4].y=wKing.y+1;
N[5].x=wKing.x-1;
N[5].y=wKing.y+2;
N[6].x=wKing.x+2;
N[6].y=wKing.y+1;
N[7].x=wKing.x+1;
N[7].y=wKing.y+2;
int i;
for (i=0;i<8;i++) if (chessboard[N[i].y][N[i].x]=='n') return 1;
return 0;
}
int isBKInCheck(struct coordinates bKing)
{
cur=bKing;//the first assignment
while (1)//left of the above
{
--cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='P'||curChar=='R'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//the above
{
--cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//right of the above
{
--cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='P'||curChar=='R'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//left
{
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
while (1)//right
{
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
int _1st_step=0;
while (1)//left of the below
{
++cur.y;
--cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='B'||(curChar=='P'&&!_1st_step)||curChar=='Q') return 1;
else if (curChar=='N'||curChar=='R'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
_1st_step++;
}
cur=bKing;//re-assignment
while (1)//the below
{
++cur.y;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if (curChar=='R'||curChar=='Q') return 1;
else if (curChar=='B'||curChar=='N'||curChar=='P'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
}
cur=bKing;//re-assignment
_1st_step=0;
while (1)//right of the below
{
++cur.y;
++cur.x;
char curChar=chessboard[cur.y][cur.x];//declare a char to make statements simpler
if (cur.x<0||cur.x>7||cur.y<0||cur.y>7) break;//break condition
if ((curChar=='P'&&!_1st_step)||curChar=='B'||curChar=='Q') return 1;//the correct determination of pawns
else if (curChar=='N'||curChar=='R'||curChar=='K') break;//the enemy's chesses but not the correct one
else if (curChar<115&&curChar>97) break;//own chesses
_1st_step++;
}
struct coordinates N[8];//assume that the knight are on one of the 8 situation
N[0].x=bKing.x-2;//initialize
N[0].y=bKing.y-1;
N[1].x=bKing.x-1;
N[1].y=bKing.y-2;
N[2].x=bKing.x+2;
N[2].y=bKing.y-1;
N[3].x=bKing.x+1;
N[3].y=bKing.y-2;
N[4].x=bKing.x-2;
N[4].y=bKing.y+1;
N[5].x=bKing.x-1;
N[5].y=bKing.y+2;
N[6].x=bKing.x+2;
N[6].y=bKing.y+1;
N[7].x=bKing.x+1;
N[7].y=bKing.y+2;
int i;
for (i=0;i<8;i++) if (chessboard[N[i].y][N[i].x]=='N') return 1;
return 0;
}
Re: 10196 - Check The Check
Posted: Tue Jun 23, 2009 12:55 am
by ThanatosX
jud wrote:here some test cases:
Code: Select all
........
...k....
....P...
........
........
........
.....K..
........
........
...k....
..P.....
........
........
........
.....K..
........
........
...k....
........
........
........
...R....
.....K..
........
........
...k..R.
........
........
........
........
.....K..
........
........
R..k....
........
........
........
........
.....K..
........
........
........
...R....
...k....
........
........
.....K..
........
........
...k....
........
.....B..
........
........
.....K..
........
........
...k....
........
.B......
........
........
.....K..
........
.....B..
........
...k....
........
........
........
.....K..
........
.B......
........
...k....
........
........
........
.....K..
........
........
...k....
........
...p....
........
...R....
.....K..
........
........
...k....
..r.....
.B......
........
........
.....K..
........
........
...k....
........
..N.....
........
........
.....K..
........
........
...k....
...pp...
....N...
........
........
.....K..
........
........
........
........
...k....
........
....p...
.....K..
........
........
........
........
..pk....
.N......
........
.....K..
........
........
........
........
...k.q..
.....N..
........
.....K..
........
........
..N.....
........
...k....
........
........
.....K..
........
........
....N...
........
...k....
........
........
.....K..
........
........
........
.....N..
...k....
........
........
.....K..
........
........
........
.N......
...k....
........
........
.....K..
........
........
q.......
........
...k....
........
....P...
.....K..
........
........
q.......
........
...k....
........
....P.p.
.....K..
........
.....r..
........
........
...k....
........
........
.r...K..
........
........
........
........
...k....
........
........
.....K..
...b....
r......r
........
........
...k....
........
...n....
.....K..
........
K......k
........
........
........
........
........
........
.......b
K......k
........
..p.....
........
........
........
........
.......b
Kp.....k
prn.....
..p.....
........
........
........
........
.......b
K..R...k
........
..p.....
........
........
........
........
.......b
K.pr...k
b....q..
..p..nn.
........
..b.....
........
........
bq.....b
K..RB..k
.....R.P
..p.....
.......Q
........
........
........
.......b
......B.
........
..p.....
........
..Kpk..r
........
........
.......b
......P.
...K.k..
..p.....
........
........
........
........
.......b
........
...K....
pppppppp
..n.n...
........
........
.k......
.......b
........
...K....
pppppppp
........
........
........
k.......
.......b
........
........
...k....
........
.B.R....
........
........
.K......
..k.....
ppp.pppp
........
.R...B..
........
........
PPPPPPPP
K.......
rnbqk.nr
ppp..ppp
....p...
...p....
.bPP....
.....N..
PP..PPPP
RNBQKB.R
........
...k....
....P...
........
........
........
.....K..
........
........
...k....
..P.....
........
........
........
.....K..
........
........
...k....
........
........
........
...R....
.....K..
........
........
...k..R.
........
........
........
........
.....K..
........
........
R..k....
........
........
........
........
.....K..
........
........
........
...R....
...k....
........
........
.....K..
........
........
...k....
........
.....B..
........
........
.....K..
........
........
...k....
........
.B......
........
........
.....K..
........
.....B..
........
...k....
........
........
........
.....K..
........
.B......
........
...k....
........
........
........
.....K..
........
........
...k....
........
...p....
........
...R....
.....K..
........
........
...k....
..r.....
.B......
........
........
.....K..
........
........
...k....
........
..N.....
........
........
.....K..
........
........
...k....
...pp...
....N...
........
........
.....K..
........
........
........
........
...k....
........
........
.....K..
........
........
........
........
..pk....
.N......
........
.....K..
........
........
........
........
...k.q..
.....N..
........
.....K..
........
........
..N.....
........
...k....
........
........
.....K..
........
........
....N...
........
...k....
........
........
.....K..
........
........
........
.....N..
...k....
........
........
.....K..
........
........
........
.N......
...k....
........
........
.....K..
........
........
q.......
........
...k....
........
....P...
.....K..
........
........
q.......
........
...k....
........
....P.p.
.....K..
........
.....r..
........
........
...k....
........
........
.r...K..
........
........
........
........
...k....
........
........
.....K..
...b....
r......r
........
........
...k....
........
...n....
.....K..
........
........
........
........
........
........
........
........
........
Hi, guys.
I got WA.
My program produced this output:
Code: Select all
Game #1: black king is in check.
Game #2: black king is in check.
Game #3: black king is in check.
Game #4: black king is in check.
Game #5: black king is in check.
Game #6: black king is in check.
Game #7: black king is in check.
Game #8: black king is in check.
Game #9: black king is in check.
Game #10: black king is in check.
Game #11: no king is in check.
Game #12: no king is in check.
Game #13: black king is in check.
Game #14: black king is in check.
Game #15: white king is in check.
Game #16: black king is in check.
Game #17: black king is in check.
Game #18: black king is in check.
Game #19: black king is in check.
Game #20: black king is in check.
Game #21: black king is in check.
Game #22: no king is in check.
Game #23: white king is in check.
Game #24: white king is in check.
Game #25: no king is in check.
Game #26: white king is in check.
Game #27: white king is in check.
Game #28: no king is in check.
Game #29: white king is in check.
Game #30: black king is in check.
Game #31: no king is in check.
Game #32: no king is in check.
Game #33: no king is in check.
Game #34: no king is in check.
Game #35: white king is in check.
Game #36: no king is in check.
Game #37: black king is in check.
Game #38: black king is in check.
Game #39: white king is in check.
Game #40: black king is in check.
Game #41: black king is in check.
Game #42: black king is in check.
Game #43: black king is in check.
Game #44: black king is in check.
Game #45: black king is in check.
Game #46: black king is in check.
Game #47: black king is in check.
Game #48: black king is in check.
Game #49: black king is in check.
Game #50: no king is in check.
Game #51: no king is in check.
Game #52: black king is in check.
Game #53: black king is in check.
Game #54: no king is in check.
Game #55: black king is in check.
Game #56: black king is in check.
Game #57: black king is in check.
Game #58: black king is in check.
Game #59: black king is in check.
Game #60: black king is in check.
Game #61: no king is in check.
Game #62: white king is in check.
Game #63: white king is in check.
Game #64: no king is in check.
Game #65: white king is in check.
Is it correct? My code is this one:
Code: Select all
#include <stdio.h>
enum colors
{
BLACK, WHITE, NONE
};
typedef struct
{
int x, y;
} piece;
void
readLine(char linha[8])
{
scanf("\n%[^\n]", (char *) &linha);
}
void
printTable(char board[8][8])
{
int i, j;
for (i = 0; i < 8; ++i)
{
for (j = 0; j < 8; ++j)
printf("%c", board[i][j]);
printf("\n");
}
}
int
readBoard(char board[8][8])
{
int i;
char buff[8];
if (scanf("\n\n%[^\n]", (char *) &buff) != EOF)
{
for (i = 0; i < 8; ++i)
board[0][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[1][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[2][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[3][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[4][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[5][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[6][i] = buff[i];
scanf("\n%[^\n]", (char *) &buff);
for (i = 0; i < 8; ++i)
board[7][i] = buff[i];
return 1;
}
return 0;
}
int
getKings(char board[8][8], piece* Kings)
{
int a, b;
Kings[BLACK].x = 99;
Kings[WHITE].x = 99;
for (a = 0; a < 8; ++a)
for (b = 0; b < 8; ++b)
{
if (board[a][b] == 'k')
{
Kings[BLACK].x = a;
Kings[BLACK].y = b;
}
else if (board[a][b] == 'K')
{
Kings[WHITE].x = a;
Kings[WHITE].y = b;
}
}
if (Kings[BLACK].x == Kings[WHITE].x && Kings[WHITE].x == 99)
return 1;
return 0;
}
int
checkPawn(char board[8][8], piece* Kings)
{
piece pawn = Kings[BLACK];
pawn.x += 1;
pawn.y -= 1;
if (pawn.x > -1 && pawn.y > -1)
{
if (board[pawn.x][pawn.y] == 'P')
return BLACK;
}
pawn.y += 2;
if (pawn.x > -1 && pawn.y < 8)
{
if (board[pawn.x][pawn.y] == 'P')
return BLACK;
}
pawn = Kings[WHITE];
pawn.x -= 1;
pawn.y -= 1;
if (pawn.x < 8 && pawn.y > -1)
{
if (board[pawn.x][pawn.y] == 'p')
return WHITE;
}
pawn.y += 2;
if (pawn.x < 8 && pawn.y < 8)
{
if (board[pawn.x][pawn.y] == 'p')
return WHITE;
}
return NONE;
}
int
checkVertical(char board[8][8], piece* Kings)
{
int i;
char p;
/* DOWN */
for (i = Kings[WHITE].x + 1; i < 8; ++i)
{
p = board[i][Kings[WHITE].y];
if (p == 'q' || p == 'r')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x + 1; i < 8; ++i)
{
p = board[i][Kings[BLACK].y];
if (p == 'Q' || p == 'R')
return BLACK;
if (p != '.')
break;
}
/* UP */
for (i = Kings[WHITE].x - 1; i > -1; --i)
{
p = board[i][Kings[WHITE].y];
if (p == 'q' || p == 'r')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x - 1; i > -1; --i)
{
p = board[i][Kings[BLACK].y];
if (p == 'Q' || p == 'R')
return BLACK;
if (p != '.')
break;
}
return NONE;
}
int
checkHorizontal(char board[8][8], piece* Kings)
{
int i;
char p;
/* RIGHT */
for (i = Kings[WHITE].y + 1; i < 8; ++i)
{
p = board[Kings[WHITE].x][i];
if (p == 'q' || p == 'r')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].y + 1; i < 8; ++i)
{
p = board[Kings[BLACK].x][i];
if (p == 'Q' || p == 'R')
return BLACK;
if (p != '.')
break;
}
/* LEFT */
for (i = Kings[WHITE].y - 1; i > -1; --i)
{
p = board[Kings[WHITE].x][i];
if (p == 'q' || p == 'r')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].y - 1; i > -1; --i)
{
p = board[Kings[BLACK].x][i];
if (p == 'Q' || p == 'R')
return BLACK;
if (p != '.')
break;
}
return NONE;
}
int
checkDiagonals(char board[8][8], piece* Kings)
{
int i, j;
char p;
/* DOWN-RIGHT*/
for (i = Kings[WHITE].x + 1, j = Kings[WHITE].y + 1; i < 8 && j < 8; ++i, ++j)
{
p = board[i][j];
if (p == 'q' || p == 'b')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x + 1, j = Kings[BLACK].y + 1; i < 8 && j < 8; ++i, ++j)
{
p = board[i][j];
if (p == 'Q' || p == 'B')
return BLACK;
if (p != '.')
break;
}
/* DOWN-LEFT*/
for (i = Kings[WHITE].x - 1, j = Kings[WHITE].y + 1; i > -1 && j < 8; --i, ++j)
{
p = board[i][j];
if (p == 'q' || p == 'b')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x - 1, j = Kings[BLACK].y + 1; i > -1 && j < 8; --i, ++j)
{
p = board[i][j];
if (p == 'Q' || p == 'B')
return BLACK;
if (p != '.')
break;
}
/* UP-RIGHT */
for (i = Kings[WHITE].x + 1, j = Kings[WHITE].y - 1; i < 8 && j > -1; ++i, --j)
{
p = board[i][j];
if (p == 'q' || p == 'b')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x + 1, j = Kings[BLACK].y - 1; i < 8 && j > -1; ++i, --j)
{
p = board[i][j];
if (p == 'Q' || p == 'B')
return BLACK;
if (p != '.')
break;
}
/* UP-LEFT */
for (i = Kings[WHITE].x - 1, j = Kings[WHITE].y - 1; i > -1 && j > -1; --i, --j)
{
p = board[i][j];
if (p == 'q' || p == 'b')
return WHITE;
if (p != '.')
break;
}
for (i = Kings[BLACK].x - 1, j = Kings[BLACK].y - 1; i > -1 && j > -1; --i, --j)
{
p = board[i][j];
if (p == 'Q' || p == 'B')
return BLACK;
if (p != '.')
break;
}
return NONE;
}
int
checkKnight(char board[8][8], piece* Kings)
{
piece knight;
knight.x = Kings[WHITE].x + 2;
knight.y = Kings[WHITE].y + 1;
if (knight.y < 8 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x + 1;
knight.y = Kings[WHITE].y + 2;
if (knight.y < 8 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x - 1;
knight.y = Kings[WHITE].y + 2;
if (knight.y > -1 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x - 2;
knight.y = Kings[WHITE].y + 1;
if (knight.y > -1 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x - 2;
knight.y = Kings[WHITE].y - 1;
if (knight.y > -1 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x - 1;
knight.y = Kings[WHITE].y - 2;
if (knight.y > -1 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x + 1;
knight.y = Kings[WHITE].y - 2;
if (knight.y < 8 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[WHITE].x + 2;
knight.y = Kings[WHITE].y - 1;
if (knight.y < 8 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'n')
return WHITE;
}
knight.x = Kings[BLACK].x + 2;
knight.y = Kings[BLACK].y + 1;
if (knight.y < 8 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x + 1;
knight.y = Kings[BLACK].y + 2;
if (knight.y < 8 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x - 1;
knight.y = Kings[BLACK].y + 2;
if (knight.y > -1 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x - 2;
knight.y = Kings[BLACK].y + 1;
if (knight.y > -1 && knight.x < 8)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x - 2;
knight.y = Kings[BLACK].y - 1;
if (knight.y > -1 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x - 1;
knight.y = Kings[BLACK].y - 2;
if (knight.y > -1 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x + 1;
knight.y = Kings[BLACK].y - 2;
if (knight.y < 8 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
knight.x = Kings[BLACK].x + 2;
knight.y = Kings[BLACK].y - 1;
if (knight.y < 8 && knight.x > -1)
{
if (board[knight.x][knight.y] == 'N')
return BLACK;
}
return NONE;
}
int
main()
{
int nGame = 0;
char board[8][8];
piece Kings[2];
while (readBoard(board))
{
if (getKings(board, (piece*) Kings))
break;
switch (checkPawn(board, (piece*) Kings))
{
case BLACK:
printf("Game #%d: black king is in check.\n", ++nGame);
continue;
case WHITE:
printf("Game #%d: white king is in check.\n", ++nGame);
continue;
}
switch (checkHorizontal(board, (piece*) Kings))
{
case BLACK:
printf("Game #%d: black king is in check.\n", ++nGame);
continue;
case WHITE:
printf("Game #%d: white king is in check.\n", ++nGame);
continue;
}
switch (checkVertical(board, (piece*) Kings))
{
case BLACK:
printf("Game #%d: black king is in check.\n", ++nGame);
continue;
case WHITE:
printf("Game #%d: white king is in check.\n", ++nGame);
continue;
}
switch (checkDiagonals(board, (piece*) Kings))
{
case BLACK:
printf("Game #%d: black king is in check.\n", ++nGame);
continue;
case WHITE:
printf("Game #%d: white king is in check.\n", ++nGame);
continue;
}
switch (checkKnight(board, (piece*) Kings))
{
case BLACK:
printf("Game #%d: black king is in check.\n", ++nGame);
continue;
case WHITE:
printf("Game #%d: white king is in check.\n", ++nGame);
continue;
}
printf("Game #%d: no king is in check.\n", ++nGame);
}
return 0;
}
Thank you guys.
Kind Regards,
Luan