UVA1589——xiangqi

开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以吃掉它,这样做黑将军吃子这一情况就可以完美的跳过了,因为只看不在黑将军移动后位置的棋子是否能吃掉他。二维数组模拟棋盘,注意皇宫,玩过象棋的应该对规则比较熟悉,注意憋马脚的情况,不懂得可以看看中国象棋的规则。下面附上我的AC代码,主要是输入那块很烦,只是用getchar()读掉一个回车的话本地测试是对的,交上去却会出现问题,只好用字符串读,然后取首字母。

AC代码:

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

 

posted @ 2018-01-22 23:21  FanJiaming  阅读(212)  评论(0编辑  收藏  举报