象棋(模拟题)

一、题目

考虑一个残局,其中红方有n个棋子,黑方只有一个将,红方除了帅以外还有:车(R)、马(H)、炮(C)三种可能得棋子,并且考虑"蹩马脚"和将帅不能照面。输入所有棋子位置坐标,保证局面合法且红方已被将军。你任务是判断红方是否已被黑方将死。

二、思路

用两个二维数组,一个存所有棋子的位置,一个记录所有棋子的死伤范围。要考虑黑将吃子的情况(所以本身不能包括在杀伤范围内)。写3个杀伤函数(帅可以看作车),判断将向4个方向移动,是否有不再杀伤范围内的。

三、代码

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<iostream>
  4 using namespace std;
  5 char pieces[11][10];
  6 char range[11][10];
  7 int pos[8][3];
  8 
  9 void RG(int x, int y)
 10 {
 11     for (int i = x - 1; i >= 1; i--)
 12     {
 13         range[i][y] = 'S';
 14         if (pieces[i][y] != 'A' && pieces[i][y] != 'B')  break;
 15     }
 16     for (int i = x + 1; i <= 10; i++)
 17     {
 18         range[i][y] = 'S';
 19         if (pieces[i][y] != 'A' && pieces[i][y] != 'B')  break;
 20     }
 21     for (int i = y - 1; i >= 1; i--)
 22     {
 23         range[x][i] = 'S';
 24         if (pieces[x][i] != 'A' && pieces[x][i] != 'B')  break;
 25     }
 26     for (int i = y + 1; i <= 9; i++)
 27     {
 28         range[x][i] = 'S';
 29         if (pieces[x][i] != 'A' && pieces[x][i] != 'B')  break;
 30     }
 31 }
 32 void C(int x, int y)
 33 {
 34     int i, j;
 35     for (i = x-1; i >= 1; i--)
 36     {
 37         if (pieces[i][y] == 'B')  return;
 38         if (pieces[i][y] != 'A')  break;
 39     }
 40     for ( j = i-1; j >= 1; j--)
 41     {
 42         range[j][y] = 'S';
 43         if (pieces[j][y] != 'A' && pieces[j][y] != 'B')  break;
 44     }
 45     for (i = x + 1; i <= 10; i++)
 46     {
 47         if (pieces[i][y] == 'B')  return;
 48         if (pieces[i][y] != 'A')  break;
 49     }
 50     for (j = i + 1; j <= 10; j++)
 51     {
 52         range[j][y] = 'S';
 53         if (pieces[j][y] != 'A' && pieces[j][y] != 'B')  break;
 54     }
 55 
 56     for (i = y-1; i >= 1; i--)
 57     {
 58         if (pieces[x][i] == 'B')  return;
 59         if (pieces[x][i] != 'A')  break;
 60     }
 61     for ( j = i-1; j >= 1; j--)
 62     {
 63         range[x][j] = 'S';
 64         if (pieces[x][j] != 'A' && pieces[x][j] != 'B')  break;
 65     }
 66     for (i = y + 1; i <= 9; i++)
 67     {
 68         if (pieces[x][i] == 'B')  return;
 69         if (pieces[x][i] != 'A')  break;
 70     }
 71     for (j = i + 1; j <= 9; j++)
 72     {
 73         range[x][j] = 'S';
 74         if (pieces[x][j] != 'A' && pieces[x][j] != 'B')  break;
 75     }
 76 }
 77 void H(int x, int y)
 78 {
 79     if (y + 2 <= 9 && x - 1 >= 1 && pieces[x][y + 1] == 'A')   range[x - 1][y + 2] = 'S';
 80     if (y + 2 <= 9 && x + 1 <= 10 && pieces[x][y + 1] == 'A')   range[x + 1][y + 2] = 'S';
 81     if (y - 2 >= 1 && x - 1 >= 1 && pieces[x][y - 1] == 'A')   range[x - 1][y - 2] = 'S';
 82     if (y - 2 >= 1 && x + 1 <= 10 && pieces[x][y - 1] == 'A')   range[x + 1][y - 2] = 'S';
 83     if (x + 2 <= 10 && y - 1 >= 1 && pieces[x + 1][y] == 'A')   range[x + 2][y - 1] = 'S';
 84     if (x + 2 <= 10 && y + 1 <= 9 && pieces[x + 1][y] == 'A')   range[x + 2][y + 1] = 'S';
 85     if (x - 2 >= 1 && y - 1 >= 1 && pieces[x - 1][y] == 'A')   range[x - 2][y - 1] = 'S';
 86     if (x - 2 >= 1 && y + 1 <= 9 && pieces[x - 1][y] == 'A')   range[x - 2][y + 1] = 'S';
 87 }
 88 int judge(int x, int y)
 89 {
 90     int is_secure = 0;
 91     if (x + 1 <= 3 && range[x + 1][y] != 'S')  is_secure = 1;
 92     if (x - 1 >= 1 && range[x - 1][y] != 'S')  is_secure = 1;
 93     if (y + 1 <= 6 && range[x][y + 1] != 'S')  is_secure = 1;
 94     if (y - 1 >= 4 && range[x][y - 1] != 'S')  is_secure = 1;
 95     return is_secure;
 96 }
 97 
 98 int main()
 99 {
100     int n, r, c;
101     while (scanf("%d%d%d",&n,&r,&c) == 3 && n)
102     {
103         char ch[2];
104         int r1, c1;
105         memset(pieces, 'A', sizeof(pieces));
106         memset(range, 'A', sizeof(range));
107         memset(pos, 0, sizeof(pos));
108         pieces[r][c] = 'B';
109         for (int i = 0; i < n; i++)
110         {
111             scanf("%s", ch);
112             scanf("%d%d", &r1, &c1);
113             pieces[r1][c1] = ch[0];
114             pos[i][0] = r1;
115             pos[i][1] = c1;
116         }
117         for (int i = 0; i < n; i++)
118         {
119             int a = pos[i][0], b = pos[i][1];
120             if (pieces[a][b] == 'R' || pieces[a][b] == 'G')  RG(a, b);
121             else if (pieces[a][b] == 'H')  H(a, b);
122             else if (pieces[a][b] == 'C')  C(a, b);
123         }
124         if (!judge(r, c))
125             printf("YES\n");
126         else
127             printf("NO\n");
128     }
129     return 0;
130 }

代码写得比较长,感觉很多地方可以写成循环的形式,但现在的水平感觉不好写,哈哈,以后记得再补!

posted @ 2018-07-23 21:48  Rogn  阅读(1016)  评论(0编辑  收藏  举报