1 条题解

  • 0
    @ 2025-4-14 18:41:38

    C++ :

    /*
    	1.6.7将军(Check the Check)UVa 10196 // PC 1101017 
    */
    
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    char a[10][10];
    int x,y,X,Y;		int white=0,black=0;
    
    /////////////////////////////////blackk
    void che1(int x,int y){
    	if(y<=8&&(a[x][y]=='R'||a[x][y]=='Q')){black=1;}////
    	else if(y<=7&&a[x][y]=='.')che1(x,y+1);
    }
    void che2(int x,int y){
    	if(y>=0&&(a[x][y]=='R'||a[x][y]=='Q')){black=1;}////
    	else if(y>=1&&a[x][y]=='.')che2(x,y-1);
    }
    void che3(int x,int y){
    	if(x<=8&&(a[x][y]=='R'||a[x][y]=='Q')){black=1;}////
    	else if(x<=7&&a[x][y]=='.')che3(x+1,y);
    }
    void che4(int x,int y){
    	if(x>=0&&(a[x][y]=='R'||a[x][y]=='Q')){black=1;}////
    	else if(x>=1&&a[x][y]=='.')che4(x-1,y);
    }
    //////////////////////////
    void xiang1(int x,int y){
    	if(x<=8&&y<=8&&(a[x][y]=='B'||a[x][y]=='Q'))black=1;
    	else if(x<=7&&y<=7&&(a[x][y]=='.'))xiang1(x+1,y+1);
    }
    void xiang2(int x,int y){
    	if(x<=8&&y>=0&&(a[x][y]=='B'||a[x][y]=='Q'))black=1;
    	else if(x<=7&&y>=1&&(a[x][y]=='.'))xiang2(x+1,y-1);
    }
    void xiang3(int x,int y){
    	if(x>=0&&y<=8&&(a[x][y]=='B'||a[x][y]=='Q'))black=1;
    	else if(x>=1&&y<=7&&(a[x][y]=='.'))xiang3(x-1,y+1);
    }
    void xiang4(int x,int y){
    	if(x>=0&&y>=0&&(a[x][y]=='B'||a[x][y]=='Q'))black=1;///->1未改 
    	else if(x>=1&&y>=1&&(a[x][y]=='.'))xiang4(x-1,y-1);///->2
    }
    //////////////////////////////////
    
    
    /////////////////////////////////white
    void che11(int X,int Y){
    	if(Y<=8&&(a[X][Y]=='r'||a[X][Y]=='q')){white=1;}////
    	else if(Y<=7&&a[X][Y]=='.')che11(X,Y+1);
    }
    void che22(int X,int Y){
    	if(Y>=0&&(a[X][Y]=='r'||a[X][Y]=='q')){white=1;}////
    	else if(Y>=1&&a[X][Y]=='.')che22(X,Y-1);
    }
    void che33(int X,int Y){
    	if(X<=8&&(a[X][Y]=='r'||a[X][Y]=='q')){white=1;}////
    	else if(X<=7&&a[X][Y]=='.')che33(X+1,Y);
    }
    void che44(int X,int Y){
    	if(X>=0&&(a[X][Y]=='r'||a[X][Y]=='q')){white=1;}////
    	else if(X>=1&&a[X][Y]=='.')che44(X-1,Y);
    }
    //////////////////////////
    void xiang11(int X,int Y){
    	if(X<=8&&Y<=8&&(a[X][Y]=='b'||a[X][Y]=='q'))white=1;
    	else if(X<=7&&Y<=7&&(a[X][Y]=='.'))xiang11(X+1,Y+1);
    }
    void xiang22(int X,int Y){
    	if(X<=8&&Y>=0&&(a[X][Y]=='b'||a[X][Y]=='q'))white=1;
    	else if(X<=7&&Y>=1&&(a[X][Y]=='.'))xiang22(X+1,Y-1);
    }
    void xiang33(int X,int Y){
    	if(X>=0&&Y<=8&&(a[X][Y]=='b'||a[X][Y]=='q'))white=1;
    	else if(X>=1&&Y<=7&&(a[X][Y]=='.'))xiang33(X-1,Y+1);
    }
    void xiang44(int X,int Y){
    	if(X>=0&&Y>=0&&(a[X][Y]=='b'||a[X][Y]=='q'))white=1;///->1未改 
    	else if(X>=1&&Y>=1&&(a[X][Y]=='.'))xiang44(X-1,Y-1);///->2
    }
    //////////////////////////////////
    
    
    
    
    int main(){
    	
    //	freopen("1.6.7input.txt","r",stdin);
    //	freopen("1.6.7output.txt","w",stdout);
    	int flag=1,flag1=1,flag2=1,num=0;
    
    //input1
    	for(int i=1;i<=8;i++){
    		for(int j=1;j<=8;j++){
    			a[i][j]=getchar();
    			while(flag){if(a[i][j]!='.')flag=0;break;}
    			while(flag1){if(a[i][j]=='k'){x=i;y=j;flag1=0;}break;}
    			while(flag2){if(a[i][j]=='K'){X=i;Y=j;flag2=0;}break;}
    		}
    		getchar();
    	}
    //mainfunc	
    	while(!flag){
    		
    	getchar();///////////空行 
    	
    		num++;flag=flag1=flag2=1;
    		 white=0,black=0;
    		while(1){
    			
    ////////////////////////////////////////BLACK
    
    			if(a[x+1][y+1]=='P'&&x+1<=8&&y+1<=8||a[x+1][y-1]=='P'&&x+1<=8&&y-1>=1){black=1;break;}//卒 
    
    		    che1(x,y+1);if(black==1)break;//有皇后 
    		    che2(x,y-1);if(black==1)break;
    		    che3(x+1,y);if(black==1)break;
    		    che4(x-1,y);if(black==1)break;
    
    			xiang1(x+1,y+1);if(black==1)break; //有皇后					
    			xiang2(x+1,y-1);if(black==1)break; //有皇后					
    			xiang3(x-1,y+1);if(black==1)break; //有皇后					
    			xiang4(x-1,y-1);if(black==1)break; //有皇后					
    //			
    			if(a[x+2][y+1]=='N'&&x+2<=8&&y+1<=8||
    			a[x+1][y+2]=='N'&&x+1<=8&&y+2<=8||
    			a[x-1][y-2]=='N'&&x-1>=1&&y-2>=1||
    			a[x-2][y-1]=='N'&&x-2>=1&&y-1>=1||
    			a[x+1][y-2]=='N'&&x+1<=8&&y-2>=1||
    			a[x+2][y-1]=='N'&&x+2<=8&&y-1>=1||
    			a[x-1][y+2]=='N'&&x-1>=1&&y+2<=8||
    			a[x-2][y+1]=='N'&&x-2>=1&&y+1<=8			
    			) {black=1;break;}//马
    			 
    			if(a[x+1][y+1]=='K'&&x+1<=8&&y+1<=8||
    			a[x-1][y-1]=='K'&&x-1>=1&&y-1>0||
    			a[x+1][y-1]=='K'&&x+1<=8&&y+1>0||
    			a[x-1][y+1]=='K'&&x+1>0&&y+1<=8||
    			a[x][y+1]=='K'&&y+1<=8||
    			a[x+1][y]=='K'&&x+1<=8||
    			a[x-1][y]=='K'&&x-1>=1||
    			a[x][y-1]=='K'&&y-1>=1			
    			) {black=1;break;}//王 
    
    
    /////////////////////////////////////////////WHITE
    //卒上 
    			if(a[X-1][Y-1]=='p'&&X-1>=1&&Y-1>=1||a[X-1][Y+1]=='p'&&Y+1<=8&&X-1>=1){white=1;break;}//卒 
    
    		    che11(X,Y+1);if(white==1)break;//有皇后 
    		    che22(X,Y-1);if(white==1)break;
    		    che33(X+1,Y);if(white==1)break;
    		    che44(X-1,Y);if(white==1)break;
    
    			xiang11(X+1,Y+1);if(white==1)break; //有皇后					
    			xiang22(X+1,Y-1);if(white==1)break; //有皇后					
    			xiang33(X-1,Y+1);if(white==1)break; //有皇后					
    			xiang44(X-1,Y-1);if(white==1)break; //有皇后					
    //			
    			if(a[X+2][Y+1]=='n'&&X+2<=8&&Y+1<=8||
    			a[X+1][Y+2]=='n'&&X+1<=8&&Y+2<=8||
    			a[X-1][Y-2]=='n'&&X-1>=1&&Y-2>=1||
    			a[X-2][Y-1]=='n'&&X-2>=1&&Y-1>=1||
    			a[X+1][Y-2]=='n'&&X+1<=8&&Y-2>=1||
    			a[X+2][Y-1]=='n'&&X+2<=8&&Y-1>=1||
    			a[X-1][Y+2]=='n'&&X-1>=1&&Y+2<=8||
    			a[X-2][Y+1]=='n'&&X-2>=1&&Y+1<=8			
    			) {white=1;break;}//马
    			 
    			if(a[X+1][Y+1]=='k'&&X+1<=8&&Y+1<=8||
    			a[X-1][Y-1]=='k'&&X-1>=1&&Y-1>0||
    			a[X+1][Y-1]=='k'&&X+1<=8&&Y+1>0||
    			a[X-1][Y+1]=='k'&&X+1>0&&Y+1<=8||
    			a[X][Y+1]=='k'&&Y+1<=8||
    			a[X+1][Y]=='k'&&X+1<=8||
    			a[X-1][Y]=='k'&&X-1>=1||
    			a[X][Y-1]=='k'&&Y-1>=1			
    			) {white=1;break;}//王 
    
    
    
    			break;		
    		}
    //output		
    		if(black)cout<<"Game #"<<num<<": black king is in check.\n";
    		else if(white)cout<<"Game #"<<num<<": white king is in check.\n";
    		else cout<<"Game #"<<num<<": no king is in check.\n";
    
    //input
    		for(int i=1;i<=8;i++){
    		for(int j=1;j<=8;j++){
    			a[i][j]=getchar();
    			while(flag){if(a[i][j]!='.')flag=0;break;}
    			while(flag1){if(a[i][j]=='k'){x=i;y=j;flag1=0;}break;}
    			while(flag2){if(a[i][j]=='K'){X=i;Y=j;flag2=0;}break;}
    		}
    		getchar();
    		}
    	
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    3159
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者