rt,别看那么多,麻烦,关键点在于rook函数和bishop函数,只会扩展1格,接下来就不会扩展了。
#include<iostream>
using namespace std;
char s[1005][1005];
bool wk[1005][1005];
bool bk[1005][1005];
int n;
void knight(int x,int y,bool white){
if(white){
if(x>=3&&y>=2)wk[x-2][y-1]=true;
if(x<=n-2&&y>=2)wk[x+2][y-1]=true;
if(x>=2&&y>=3)wk[x-1][y-2]=true;
if(x<=n-1&&y>=3)wk[x+1][y-2]=true;
if(x>=3&&y<=n-1)wk[x-2][y+1]=true;
if(x<=n-2&&y<=n-1)wk[x+2][y+1]=true;
if(x>=2&&y<=n-2)wk[x-1][y+2]=true;
if(x<=n-1&&y<=n-2)wk[x+1][y+2]=true;
}
else{
if(x>=3&&y>=2)bk[x-2][y-1]=true;
if(x<=n-2&&y>=2)bk[x+2][y-1]=true;
if(x>=2&&y>=3)bk[x-1][y-2]=true;
if(x<=n-1&&y>=3)bk[x+1][y-2]=true;
if(x>=3&&y<=n-1)bk[x-2][y+1]=true;
if(x<=n-2&&y<=n-1)bk[x-2][y+1]=true;
if(x>=2&&y<=n-2)bk[x-2][y+2]=true;
if(x<=n-1&&y<=n-2)bk[x-2][y+2]=true;
}
}
void rook(int x,int y,bool white){
if(white){
int tx=x,ty=y;
do{
wk[++x][y]=true;
}while(s[x][y]=='.');
wk[x][y]=true;
x=tx,y=ty;
do{
wk[x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
wk[--x][y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
wk[x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
}
else {
int tx=x,ty=y;
do{
bk[++x][y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[--x][y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
}
}
void bishop(int x,int y,bool white){
if(white){
int tx=x,ty=y;
do{
wk[++x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
wk[--x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
wk[--x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
wk[++x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
}
else {
int tx=x,ty=y;
do{
bk[++x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[--x][++y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[--x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
do{
bk[++x][--y]=true;
}while(s[x][y]=='.');
x=tx,y=ty;
}
}
void king(int x,int y,bool white){
if(white){
wk[x][y+1]=true;
wk[x][y-1]=true;
wk[x+1][y]=true;
wk[x+1][y+1]=true;
wk[x+1][y-1]=true;
wk[x-1][y]=true;
wk[x-1][y+1]=true;
wk[x-1][y-1]=true;
}
else {
bk[x][y+1]=true;
bk[x][y-1]=true;
bk[x+1][y]=true;
bk[x+1][y+1]=true;
bk[x+1][y-1]=true;
bk[x-1][y]=true;
bk[x-1][y+1]=true;
bk[x-1][y-1]=true;
}
}
void pawn(int x,int y,bool white){
if(white){
wk[x-1][y-1]=true;
wk[x-1][y+1]=true;
}
else {
bk[x+1][y-1]=true;
bk[x+1][y+1]=true;
}
}
void queen(int x,int y,bool white){
bishop(x,y,white);
rook(x,y,white);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>s[i][j];
switch(s[i][j]){
case 'K':king(i,j,1);break;
case 'k':king(i,j,0);break;
case 'Q':queen(i,j,1);break;
case 'q':queen(i,j,0);break;
case 'R':rook(i,j,1);break;
case 'r':rook(i,j,0);break;
case 'B':bishop(i,j,1);break;
case 'b':bishop(i,j,0);break;
case 'N':knight(i,j,1);break;
case 'n':knight(i,j,0);break;
case 'P':pawn(i,j,1);break;
case 'p':pawn(i,j,0);break;
default:break;
}
}
}
long long wcnt=0,bcnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(s[i][j]<='Z'&&s[i][j]>='A')if(!wk[i][j])wcnt++;
if(s[i][j]<='z'&&s[i][j]>='a')if(!bk[i][j])bcnt++;
}
}
cout<<wcnt<<" "<<bcnt;
// cout<<"wk:"<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<wk[i][j];
// }
// cout<<endl;
// }
// cout<<"bk:"<<endl;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=n;j++){
// cout<<bk[i][j];
// }
// cout<<endl;
// }
return 0;
}