The analysis:
This problem is so easy, but it is so difficult to AC that you should be more cautious.I have got many WAs.Because I made many mistakes.Although this problem waste much time, I got some lectures,which are as follows:
1.you must think over before you begin to code.
2.if your code has many similar parts, do not just copy , or else, you will make many mistakes,and they are difficult to find.
3.you had better handle the warnings. Such as:"not all control paths return a value",if you use a "if",you must write a "else" to match it.
The code:(a little longer,but you can discuss all the directions of the King, not the "p,n,r...",then you code may be shorter.)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char bord[15][15];
struct Point
{
int x,y;
}k1,k2;
int solve(int i,int j)
{
int m,n,k;
if(bord[i][j]=='.')
return 0;
else if(bord[i][j]=='p')
{
if(bord[i+1][j-1]=='K'||bord[i+1][j+1]=='K')
return 1;
else
return 0;
}
else if(bord[i][j]=='P')
{
if(bord[i-1][j-1]=='k'||bord[i-1][j+1]=='k')
return 2;
else
return 0;
}
else if(bord[i][j]=='r')
{
if(k2.x==i)
{
m=k2.y<j?k2.y:j;
n=k2.y>j?k2.y:j;
for(k=m+1;k<n;k++)
{
if(bord[i][k]!='.')
break;
}
if(k==n)
return 1;
else
return 0;
}
else if(k2.y==j)
{
m=k2.x<i?k2.x:i;
n=k2.x>i?k2.x:i;
for(k=m+1;k<n;k++)
{
if(bord[k][j]!='.')
break;
}
if(k==n)
return 1;
else
return 0;
}
else
return 0;
}
else if(bord[i][j]=='R')
{
if(k1.x==i)
{
m=k1.y<j?k1.y:j;
n=k1.y>j?k1.y:j;
for(k=m+1;k<n;k++)
{
if(bord[i][k]!='.')
break;
}
if(k==n)
return 2;
else
return 0;
}
else if(k1.y==j)
{
m=k1.x<i?k1.x:i;
n=k1.x>i?k1.x:i;
for(k=m+1;k<n;k++)
{
if(bord[k][j]!='.')
break;
}
if(k==n)
return 2;
else
return 0;
}
else
return 0;
}
else if(bord[i][j]=='b')
{
if(j-k2.y==k2.x-i)
{
if(i>k2.x)
{
for(m=i-1,n=j+1;m>k2.x;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k2.x)
return 1;
else
return 0;
}
else
{
for(m=k2.x-1,n=k2.y+1;m>i;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 1;
else
return 0;
}
}
else if(j-k2.y==i-k2.x)
{
if(i<k2.x)
{
for(m=i+1,n=j+1;m<k2.x;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k2.x)
return 1;
else
return 0;
}
else
{
for(m=k2.x+1,n=k2.y+1;m<i;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 1;
else
return 0;
}
}
else
return 0;
}
else if(bord[i][j]=='B')
{
if(j-k1.y==k1.x-i)
{
if(i>k1.x)
{
for(m=i-1,n=j+1;m>k1.x;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k1.x)
return 2;
else
return 0;
}
else
{
for(m=k1.x-1,n=k1.y+1;m>i;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 2;
else
return 0;
}
}
else if(j-k1.y==i-k1.x)
{
if(i<k1.x)
{
for(m=i+1,n=j+1;m<k1.x;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k1.x)
return 2;
else
return 0;
}
else
{
for(m=k1.x+1,n=k1.y+1;m<i;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 2;
else
return 0;
}
}
else
return 0;
}
else if(bord[i][j]=='q')
{
if(k2.x==i)
{
m=k2.y<j?k2.y:j;
n=k2.y>j?k2.y:j;
for(k=m+1;k<n;k++)
{
if(bord[i][k]!='.')
break;
}
if(k==n)
return 1;
else
return 0;
}
else if(k2.y==j)
{
m=k2.x<i?k2.x:i;
n=k2.x>i?k2.x:i;
for(k=m+1;k<n;k++)
{
if(bord[k][j]!='.')
break;
}
if(k==n)
return 1;
else
return 0;
}
else if(j-k2.y==k2.x-i)
{
if(i>k2.x)
{
for(m=i-1,n=j+1;m>k2.x;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k2.x)
return 1;
else
return 0;
}
else
{
for(m=k2.x-1,n=k2.y+1;m>i;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 1;
else
return 0;
}
}
else if(j-k2.y==i-k2.x)
{
if(i<k2.x)
{
for(m=i+1,n=j+1;m<k2.x;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k2.x)
return 1;
else
return 0;
}
else
{
for(m=k2.x+1,n=k2.y+1;m<i;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 1;
else
return 0;
}
}
else
return 0;
}
else if(bord[i][j]=='Q')
{
if(k1.x==i)
{
m=k1.y<j?k1.y:j;
n=k1.y>j?k1.y:j;
for(k=m+1;k<n;k++)
{
if(bord[i][k]!='.')
break;
}
if(k==n)
return 2;
else
return 0;
}
else if(k1.y==j)
{
m=k1.x<i?k1.x:i;
n=k1.x>i?k1.x:i;
for(k=m+1;k<n;k++)
{
if(bord[k][j]!='.')
break;
}
if(k==n)
return 2;
else
return 0;
}
else if(j-k1.y==k1.x-i)
{
if(i>k1.x)
{
for(m=i-1,n=j+1;m>k1.x;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k1.x)
return 2;
else
return 0;
}
else
{
for(m=k1.x-1,n=k1.y+1;m>i;m--,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 2;
else
return 0;
}
}
else if(j-k1.y==i-k1.x)
{
if(i<k1.x)
{
for(m=i+1,n=j+1;m<k1.x;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==k1.x)
return 2;
else
return 0;
}
else
{
for(m=k1.x+1,n=k1.y+1;m<i;m++,n++)
{
if(bord[m][n]!='.')
break;
}
if(m==i)
return 2;
else
return 0;
}
}
else
return 0;
}
else if(bord[i][j]=='n')
{
if(bord[i-1][j-2]=='K'||bord[i-2][j-1]=='K'||
bord[i-2][j+1]=='K'||bord[i-1][j+2]=='K'||
bord[i+1][j-2]=='K'||bord[i+2][j-1]=='K'||
bord[i+2][j+1]=='K'||bord[i+1][j+2]=='K')
return 1;
else
return 0;
}
else if(bord[i][j]=='N')
{
if(bord[i-1][j-2]=='k'||bord[i-2][j-1]=='k'||
bord[i-2][j+1]=='k'||bord[i-1][j+2]=='k'||
bord[i+1][j-2]=='k'||bord[i+2][j-1]=='k'||
bord[i+2][j+1]=='k'||bord[i+1][j+2]=='k')
return 2;
else
return 0;
}
else
return 0;
}
int main()
{
int i,j,p=0,flag,l=0,cnt=0;
while(1)
{
p=0;
cnt++;
l=0;
memset(bord,-1,sizeof(bord));
for(i=2;i<10;i++)
{
gets(bord[i]+2);
}
for(i=2;i<10;i++)
{
for(j=2;j<10;j++)
{
if(bord[i][j]=='k')
{
p=1;
k1.x=i;
k1.y=j;
}
if(bord[i][j]=='K')
{
p=1;
k2.x=i;
k2.y=j;
}
}
}
if(p==0)
break;
getchar();
for(i=2;i<10&&!l;i++)
{
for(j=2;j<10&&!l;j++)
{
flag=solve(i,j);
if(flag==1)
{
printf("Game #%d: white king is in check./n",cnt);
l=1;
}
else if(flag==2)
{
printf("Game #%d: black king is in check./n",cnt);
l=1;
}
}
}
if(l==0)
printf("Game #%d: no king is in check./n",cnt);
}
return 0;
}