#include <stdio.h>
#include <memory.h>
#include <string.h>
char ChessBoard[8][8];
char *WhiteCheck = "white king is in check.";
char *BlackCheck = "black king is in check.";
char *NoCheck = "no king is in check.";
int boundary(int pos)
{
return pos>=0 && pos<8;
}
int checkP(int x,int y,int upper)
{
int i;
char king;
king = (upper==0)?'K':'k';
i = (upper==0)?(y+1):(y-1);
if(boundary(i))
{
if(boundary(x-1) && ChessBoard[i][x-1]==king) return 1;
if(boundary(x+1) && ChessBoard[i][x+1]==king) return 1;
}
return 0;
}
int checkR(int x,int y,int upper)
{
int i;
char king;
king = (upper==0)?'K':'k';
for(i=1;boundary(x-i);i++)
{
if(ChessBoard[y][x-i]==king) return 1;
if(ChessBoard[y][x-i]!='.') break;
}
for(i=1;boundary(x+i);i++)
{
if(ChessBoard[y][x+i]==king) return 1;
if(ChessBoard[y][x+i]!='.') break;
}
for(i=1;boundary(y-i);i++)
{
if(ChessBoard[y-i][x]==king) return 1;
if(ChessBoard[y-i][x]!='.') break;
}
for(i=1;boundary(y+i);i++)
{
if(ChessBoard[y+i][x]==king) return 1;
if(ChessBoard[y+i][x]!='.') break;
}
return 0;
}
int checkB(int x,int y,int upper)
{
int i;
char king;
king = (upper==0)?'K':'k';
for(i=1;boundary(y-i) && boundary(x-i);i++)
{
if(ChessBoard[y-i][x-i]==king) return 1;
if(ChessBoard[y-i][x-i]!='.') break;
}
for(i=1;boundary(y+i) && boundary(x-i);i++)
{
if(ChessBoard[y+i][x-i]==king) return 1;
if(ChessBoard[y+i][x-i]!='.') break;
}
for(i=1;boundary(y-i) && boundary(x+i);i++)
{
if(ChessBoard[y-i][x+i]==king) return 1;
if(ChessBoard[y-i][x+i]!='.') break;
}
for(i=1;boundary(y+i) && boundary(x+i);i++)
{
if(ChessBoard[y+i][x+i]==king) return 1;
if(ChessBoard[y+i][x+i]!='.') break;
}
return 0;
}
int checkQ(int x,int y,int upper)
{
if(checkR(x,y,upper)) return 1;
return checkB(x,y,upper);
}
int checkN(int x,int y,int upper)
{
char king;
king = (upper==0)?'K':'k';
if(boundary(x-2)&&boundary(y-1)&&ChessBoard[y-1][x-2]==king)
return 1;
if(boundary(x-2)&&boundary(y+1)&&ChessBoard[y+1][x-2]==king)
return 1;
if(boundary(x+2)&&boundary(y-1)&&ChessBoard[y-1][x+2]==king)
return 1;
if(boundary(x+2)&&boundary(y+1)&&ChessBoard[y+1][x+2]==king)
return 1;
if(boundary(x-1)&&boundary(y-2)&&ChessBoard[y-2][x-1]==king)
return 1;
if(boundary(x-1)&&boundary(y+2)&&ChessBoard[y+2][x-1]==king)
return 1;
if(boundary(x+1)&&boundary(y-2)&&ChessBoard[y-2][x+1]==king)
return 1;
if(boundary(x+1)&&boundary(y+2)&&ChessBoard[y+2][x+1]==king)
return 1;
return 0;
}
char* check()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
switch(ChessBoard[i][j])
{
case 'p':if(checkP(j,i,0)) return WhiteCheck;
break;
case 'P':if(checkP(j,i,1)) return BlackCheck;
break;
case 'r':if(checkR(j,i,0)) return WhiteCheck;
break;
case 'R':if(checkR(j,i,1)) return BlackCheck;
break;
case 'b':if(checkB(j,i,0)) return WhiteCheck;
break;
case 'B':if(checkB(j,i,1)) return BlackCheck;
break;
case 'q':if(checkQ(j,i,0)) return WhiteCheck;
break;
case 'Q':if(checkQ(j,i,1)) return BlackCheck;
break;
case 'n':if(checkN(j,i,0)) return WhiteCheck;
break;
case 'N':if(checkN(j,i,1)) return BlackCheck;
break;
}
}
}
return NoCheck;
}
int main()
{
int i,flag=1,cases=1;
while(flag)
{
flag = 0;
memset(ChessBoard,'.',sizeof(ChessBoard));
for(i=0;i<8;i++)
{
scanf("%s",&ChessBoard[i]);
if(strcmp(ChessBoard[i],"........")!=0) flag=1;
}
if(flag){
printf("Game #%d: %s\n",cases,check());
cases++;
}
}
return 0;
}
UVa 10196 Check the Check
最新推荐文章于 2021-03-24 18:50:31 发布