uva 1589 xiangqi



大体思路就是红方上下左右四个方向各走一步,看看是否会被吃掉。如果都会被吃,就是被将死,输出YES,否则输出YES。

 #include<stdio.h>
 #include<string.h>
 #define max 15
 const int horse_x[max]={1,2,-1,-2,1,2,-1,-2};   //用数组模拟马的行走
const int horse_y[max]={2,1,-2,-1,-2,-1,2,1};
 const int dx[max] = {1,0,-1,0};  //用数组模拟车和炮的行走
const int dy[max] = {0,1,0,-1};
 struct redflag{
       char c;
       int x, y;
        } red[max];
 int black_x, black_y, T;
 char qi[max][max];
 char readchar()
 {  while(1){
         char c;
         c = getchar();
         if(c == 'R' || c == 'C' || c == 'G' || c == 'H')
           return c;
    }
 }
 int feijiang(int x, int y)
 {   int temp, i;
     for(i = x + 1,temp = -1; i <= 10; i++)
        { if(qi[i][y] != 0)
            temp++;
          if(qi[i][y] == 'G' && temp == 0)
             return 1;
        }
     return 0;
 }
 int panduan_H(int x, int y)        //判断马
{   int i;
     for(i = 0; i < 8; i++)
        if(x + horse_x[i] > 0 && y + horse_y[i] > 0 && qi[x + horse_x[i]][y + horse_y[i]] == 'H')      //判断马能否吃掉将以及蹩马腿的情况
         {  if(horse_x[i] == 2 && qi[x + 1][y + horse_y[i]] == 0)
                return 1;
             if(horse_x[i] == -2 && qi[x - 1][y + horse_y[i]] == 0)
                 return 1;
             if(horse_y[i] == -2 && qi[x + horse_x[i]][y - 1] == 0)
                 return 1;
             if(horse_y[i] == 2 && qi[x + horse_x[i]][y + 1] == 0)
                 return 1;
          }
         return 0;
 }
 int panduan(int x, int y)     //总判断,其中包含了判断飞将和马的函数
{   if(feijiang(x,y))return 1;
     int i, j, temp;
     for(i = 0; i < 4; i++){
         temp = 0;
         for(j = 1; j <= 10; j++)
           { if(qi[x+dx[i]*j][y+dy[i]*j] != 0 && x+dx[i]*j>=1 && x+dx[i]*j<=10 && y+dy[i]*j>=1 && y+dy[i]*j<=9)
                temp++;
             if(temp == 1 && qi[x+dx[i]*j][y+dy[i]*j] == 'R')
                 return 1;
             if(temp == 2 && qi[x+dx[i]*j][y+dy[i]*j] == 'C')
                 return 1;
           }
     }
     if(panduan_H(x,y))return 1;
     return 0;
 }
 int main()
 {
     int i;
     while(~scanf("%d%d%d",&T, &black_x, &black_y) && T){
             memset(qi,0,sizeof(qi));
         for(i = 1; i <= T; i++)
             {red[i].c = readchar();
              scanf("%d%d",&red[i].x, &red[i].y);
              qi[red[i].x][red[i].y] = red[i].c;
             }
         int temp1 = 0;
         for(i = black_x+1; i <= 10; i++)   //判断第一步是否飞将
         {  if(qi[i][black_y] != 0)
              temp1++;
            if(qi[i][black_y] == 'G' && temp1 == 1)
              break;
         }
         if(qi[i][black_y] == 'G' && temp1 == 1)
         {  qi[i][black_y] = 0;
            printf("NO\n");
            continue;
         }
         if(black_x > 1){
             if(!panduan(black_x-1,black_y))
               {  printf("NO\n");
                  continue;
               }
         }
         if(black_x < 3){
             if(!panduan(black_x+1,black_y)){
                 printf("NO\n");
                 continue;
             }
         }
         if(black_y < 6){
             if(!panduan(black_x,black_y+1)){
                 printf("NO\n");
                 continue;
             }
         }
         if(black_y > 4){
             if(!panduan(black_x,black_y-1)){
                 printf("NO\n");
                 continue;
             }
         }
         printf("YES\n");
     }
     return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值