站内水题求调
  • 板块学术版
  • 楼主zxh101019_6
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/11 22:17
  • 上次更新2023/11/3 04:22:15
查看原帖
站内水题求调
1061949
zxh101019_6楼主2023/8/11 22:17

rt,别看那么多,麻烦,关键点在于rook函数和bishop函数,只会扩展1格,接下来就不会扩展了。

link

#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; 
}
2023/8/11 22:17
加载中...