uva 1589 xiangqi

来源:互联网 发布:股票交易策略 知乎 编辑:程序博客网 时间:2024/04/28 21:54


大体思路就是红方上下左右四个方向各走一步,看看是否会被吃掉。如果都会被吃,就是被将死,输出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; }

1 0
原创粉丝点击