寒假的ACM训练三(PC110107/UVa10196)

#include <iostream>
#include <string.h>

using namespace std;
char qp[10][10];
int result;     //结果
int black_k_x;  //将军的x,y
int black_k_y;
int white_k_x;
int white_k_y;
int abs(int i){
   if(i<0)
      return -i;
      return i;
}
//马
bool n_check(int n_x,int n_y,int k_x,int k_y){


    if(abs(n_x-k_x)==2&&abs(n_y-k_y)==1)
       return true;
    if(abs(n_x-k_x)==1&&abs(n_y-k_y)==2)
       return  true;


       return false;


}
//兵
bool p_check(int p_x,int p_y,int k_x,int k_y){
    if(qp[p_x][p_y]=='p'){
        if(p_x+1==k_x&&abs(p_y-k_y)==1)
         return true;
    }
    else if(qp[p_x][p_y]=='P'){
        if(p_x-1==k_x&&abs(p_y-k_y)==1)
         return true;
    }
    return false;


}
//车
bool r_check(int r_x,int r_y,int k_x,int k_y){
    int  i;
     if(r_x==k_x){  //同横
         if(k_y>r_y){  //r_y 比较小
             for(i=r_y+1;i<k_y;i++)
                if(qp[r_x][i]!='.')
                break;
              if(i==k_y)
                return true;
         }
         if(k_y<r_y){


             for(i=k_y+1;i<r_y;i++)
                if(qp[r_x][i]!='.')
                break;


              if(i==r_y)
                return true;


         }


     }
     if(r_y==k_y){  //同列
         if(k_x>r_x){  //r_x比较小
             for(i=r_x+1;i<k_x;i++)
                if(qp[i][k_y]!='.')
                break;
              if(i==k_x)
                return true;
         }
         if(k_x<r_x){  //k_x 比较小


             for(i=k_x+1;i<r_x;i++)
                if(qp[i][k_y]!='.')
                break;


              if(i==r_x)
                return true;
         }


     }
     return false;


}
//象
bool b_check(int b_x,int b_y,int k_x,int k_y){
    int i,j;
    //x差和y差相同
    if(abs(b_x-k_x)==abs(b_y-k_y)){


        //xy同增
        i=b_x;j=b_y;
        while(i<k_x&&j<k_y){
            i++;j++;
            if(qp[i][j]!='.')
              break;
        }


        //x减y增
         while(i>k_x&&j<k_y){


         i--;j++;
            if(qp[i][j]!='.')
              break;
         }


        //x增y减
         while(i<k_x&&j>k_y){


         i++;j--;
            if(qp[i][j]!='.')
              break;
         }


        //x减y减
         while(i>k_x&&j>k_y){
         i--;j--;
            if(qp[i][j]!='.')
              break;
         }


        if(i==k_x&&j==k_y)
             return true;




    }
    return false;




}
//后
bool q_check(int q_x,int q_y,int k_x,int k_y){
    return r_check(q_x,q_y,k_x,k_y)||b_check(q_x,q_y,k_x,k_y);




}
void check(){


     bool f;
    for(int i=1;i<=8;i++)
    for(int j=1;j<=8;j++){


      if(qp[i][j]=='p'){
          f=(p_check(i,j,white_k_x,white_k_y));


     }else if(qp[i][j]=='n'){
         f=(n_check(i,j,white_k_x,white_k_y));




     } else if(qp[i][j]=='q'){
          f=(q_check(i,j,white_k_x,white_k_y));






     }else if(qp[i][j]=='r'){
          f=(r_check(i,j,white_k_x,white_k_y));






     }else if(qp[i][j]=='b'){
          f=(b_check(i,j,white_k_x,white_k_y));


     }


     if(f==true){


        result=1;
        return;
            }




    if(qp[i][j]=='P'){
        f=(p_check(i,j,black_k_x,black_k_y));


     }else if(qp[i][j]=='N'){
         f=(n_check(i,j,black_k_x,black_k_y));


     }else if(qp[i][j]=='Q'){
        f=(q_check(i,j,black_k_x,black_k_y));


     }else if(qp[i][j]=='R'){
         f=(r_check(i,j,black_k_x,black_k_y));


     }else if(qp[i][j]=='B'){
         f=(b_check(i,j,black_k_x,black_k_y));
     }
     if(f==true){


        result=0;
        return;
            }




    }
    result=2;












}


int main()
{
    int run=1;


    while(true){
    bool flag=true; //退出标志




    memset(qp,'.',sizeof(qp));
    for(int i=1;i<=8;i++)
      for(int j=1;j<=8;j++){
        cin>>qp[i][j];
        if(flag&&qp[i][j]!='.')
           flag=false;
        if(qp[i][j]=='k'){black_k_x=i;black_k_y=j;}
        if(qp[i][j]=='K'){white_k_x=i;white_k_y=j;}


      }
      if(flag) break; //空盘退出


       check();              //读盘






    if(result==0) //结果为0
    cout << "Game #"<<run<<": black king is in check." << endl;
    else if(result==1)
    cout << "Game #"<<run<<": white king is in check." <<endl;
    else
    cout << "Game #"<<run<<": no king is in check."<<endl;


    run++;


              }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值