zoukankan      html  css  js  c++  java
  • 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
    ", 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 }
    版权声明:该博客版权归本人所有,若有意转载,请与本人联系
  • 相关阅读:
    第10组 Beta冲刺(4/5)
    第10组 Beta冲刺(5/5)
    第10组 Beta冲刺(3/5)
    第10组 Beta冲刺(2/5)
    第10组 Beta冲刺(1/5)
    第10组 Alpha事后诸葛亮
    第10组 Alpha冲刺(6/6)
    第10组 Alpha冲刺(5/6)
    软工实践个人总结
    第09组 Beta版本演示
  • 原文地址:https://www.cnblogs.com/fan-jiaming/p/9440206.html
Copyright © 2011-2022 走看看