自己写的代码:
//uva 10196. 测试通过。
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
bool checkchess(char a[8][8])
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]!='.')
return true;
}
}
return false;
}
void input(char a[8][8])
{
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
cin>>a[i][j];
}
int* findAllking(char a[8][8])
{
int *c;
c=new int[4];
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(a[i][j]=='k')
{c[0]=i;c[1]=j;}
if(a[i][j]=='K')
{c[2]=i;c[3]=j;}
}
}
return c;
}
bool cborder(int i,int j)
{
if(i>=0&&i<8&&j>=0&&j<8)
return true;
else
return false;
}
bool checkfence1(int i,int j,int x,int y,char a[8][8])
{
int m;
if(i>x&&j==y)
{
int bias=i-x;
for(m=1;m<bias;m++)
if(a[i-m][j]!='.')
return true;
}
if(i<x&&j==y)
{
int bias=x-i;
for(m=1;m<bias;m++)
if(a[i+m][j]!='.')
return true;
}
if(j>y&&i==x)
{
int bias=j-y;
for(m=1;m<bias;m++)
if(a[i][j-m]!='.')
return true;
}
if(j<y&&i==x)
{
int bias=y-j;
for(m=1;m<bias;m++)
if(a[i][j+m]!='.')
return true;
}
return false;
}
bool checkfence2(int i,int j,int x,int y,char a[8][8])
{
int m;
if(i>x&&j>y)
{
int bias=i-x;
for(m=1;m<bias;m++)
if(a[i-m][j-m]!='.')
return true;
}
if(i>x&&j<y)
{
int bias=i-x;
for(m=1;m<bias;m++)
if(a[i-m][j+m]!='.')
return true;
}
if(j>y&&i<x)
{
int bias=j-y;
for(m=1;m<bias;m++)
if(a[i+m][j-m]!='.')
return true;
}
if(j<y&&i<x)
{
int bias=y-j;
for(m=1;m<bias;m++)
if(a[i+m][j+m]!='.')
return true;
}
return false;
}
bool threat(int i,int j,char a[8][8])
{
int k[14]={-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7};
int m;
if(a[i][j]=='k')
{
if(cborder(i+1,j+1)&&a[i+1][j+1]=='P')
return true;
if(cborder(i+1,j-1)&&a[i+1][j-1]=='P')
return true;
for(m=0;m<14;m++)
{
if(cborder(i+k[m],j)&&(a[i+k[m]][j]=='R'||a[i+k[m]][j]=='Q')&&!checkfence1(i,j,i+k[m],j,a))
return true;
if(cborder(i,j+k[m])&&(a[i][j+k[m]]=='R'||a[i][j+k[m]]=='Q')&&!checkfence1(i,j,i,j+k[m],a))
return true;
if(cborder(i+k[m],j+k[m])&&(a[i+k[m]][j+k[m]]=='B'||a[i+k[m]][j+k[m]]=='Q')&&!checkfence2(i,j,i+k[m],j+k[m],a))
return true;
if(cborder(i+k[m],j-k[m])&&(a[i+k[m]][j-k[m]]=='B'||a[i+k[m]][j-k[m]]=='Q')&&!checkfence2(i,j,i+k[m],j-k[m],a))
return true;
}
for(m=6;m<=7;m++)
{
if(cborder(i+k[m],j)&&a[i+k[m]][j]=='K')
return true;
if(cborder(i,j+k[m])&&a[i][j+k[m]]=='K')
return true;
if(cborder(i+k[m],j+k[m])&&a[i+k[m]][j+k[m]]=='K')
return true;
if(cborder(i+k[m],j-k[m])&&a[i+k[m]][j-k[m]]=='K')
return true;
}
for(m=5;m<=6;m++)
{
if(cborder(i+k[m],j+k[m+2])&&a[i+k[m]][j+k[m+2]]=='N')
return true;
if(cborder(i-k[m],j+k[m+2])&&a[i-k[m]][j+k[m+2]]=='N')
return true;
if(cborder(i+k[m],j-k[m+2])&&a[i+k[m]][j-k[m+2]]=='N')
return true;
if(cborder(i-k[m],j-k[m+2])&&a[i-k[m]][j-k[m+2]]=='N')
return true;
}
}
else if(a[i][j]=='K')
{
if(cborder(i-1,j+1)&&a[i-1][j+1]=='p')
return true;
if(cborder(i-1,j-1)&&a[i-1][j-1]=='p')
return true;
for(m=0;m<14;m++)
{
if(cborder(i+k[m],j)&&(a[i+k[m]][j]=='r'||a[i+k[m]][j]=='q')&&!checkfence1(i,j,i+k[m],j,a))
return true;
if(cborder(i,j+k[m])&&(a[i][j+k[m]]=='r'||a[i][j+k[m]]=='q')&&!checkfence1(i,j,i,j+k[m],a))
return true;
if(cborder(i+k[m],j+k[m])&&(a[i+k[m]][j+k[m]]=='b'||a[i+k[m]][j+k[m]]=='q')&&!checkfence2(i,j,i+k[m],j+k[m],a))
return true;
if(cborder(i+k[m],j-k[m])&&(a[i+k[m]][j-k[m]]=='b'||a[i+k[m]][j-k[m]]=='q')&&!checkfence2(i,j,i+k[m],j-k[m],a))
return true;
}
for(m=6;m<=7;m++)
{
if(cborder(i+k[m],j)&&a[i+k[m]][j]=='k')
return true;
if(cborder(i,j+k[m])&&a[i][j+k[m]]=='k')
return true;
if(cborder(i+k[m],j+k[m])&&a[i+k[m]][j+k[m]]=='k')
return true;
if(cborder(i+k[m],j-k[m])&&a[i+k[m]][j-k[m]]=='k')
return true;
}
for(m=5;m<=6;m++)
{
if(cborder(i+k[m],j+k[m+2])&&a[i+k[m]][j+k[m+2]]=='n')
return true;
if(cborder(i-k[m],j+k[m+2])&&a[i-k[m]][j+k[m+2]]=='n')
return true;
if(cborder(i+k[m],j-k[m+2])&&a[i+k[m]][j-k[m+2]]=='n')
return true;
if(cborder(i-k[m],j-k[m+2])&&a[i-k[m]][j-k[m+2]]=='n')
return true;
}
}
return false;
}
int main()
{
char a[8][8];
memset(a,'.',sizeof(a));
int k=1;
int* c;
c=new int[4];
input(a);
//getchar();
//getchar();
while(checkchess(a))
{
c=findAllking(a);
if(threat(c[0],c[1],a))
cout<<"Game #"<<k<<": black king is in check."<<endl;
else if(threat(c[2],c[3],a))
cout<<"Game #"<<k<<": white king is in check."<<endl;
else
cout<<"Game #"<<k<<": no king is in check."<<endl;
//cout<<endl;
input(a);
//getchar();
//getchar();
k++;
}
return 0;
}