zoukankan      html  css  js  c++  java
  • UVA 1589 Xiangqi

    Z1589 - Xiangqi

    Time limit: 3.000 seconds

    做这题的时候WA了很多次。

    解决思路是,枚举黑方将军可以移动的位置,接着判断这些位置是否被红方将军,如果所有位置会被红方吃掉,那么就是checkmate了。

    要注意的情况可能就是双炮将军。

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 char board[12][12];
     6 int dr[4] = { 1, -1, 0, 0 }, dc[4] = { 0, 0, 1, -1 };
     7 int chr[4] = { 0, 0, 1, -1 }, chc[4] = { 1, -1, 0, 0 };
     8 int hr[8] = { -2, -1, -2, -1, 1, 2, 1, 2 };
     9 int hc[8] = { -1, -2, 1, 2, -2, -1, 2, 1 };
    10 int hlr[8] = { -1, -1, -1, -1, 1, 1, 1, 1 };//绊马脚
    11 int hlc[8] = { -1, -1, 1, 1, -1, -1, 1, 1 };
    12 int check(int, int);
    13 
    14 int main()
    15 {
    16     int n, bgr, bgc, r, c, cnt;
    17     char s[5];
    18     while (scanf("%d%d%d", &n, &bgr, &bgc) == 3 && n && bgr && bgc)
    19     {
    20         cnt = 0;
    21         memset(board, 0, sizeof(board));
    22         for (int i = 0; i < n; i++){
    23             scanf("%s%d%d", s, &r, &c);
    24             board[r][c] = s[0];
    25         }
    26 
    27         //黑方将军移动
    28         for (int i = 0; i < 4; i++)
    29             cnt += check(bgr + dr[i], bgc + dc[i]);
    30         if (cnt >= 4) printf("YES
    ");
    31         else  printf("NO
    ");
    32     }
    33 }
    34 
    35 int check(int r, int c)
    36 {
    37     if (r < 1 || r > 3 || c < 4 || c > 6) return 1;
    38 
    39     //判断是否被红方的车,帅,炮将军
    40     for (int i = 0; i < 4; i++)
    41     {
    42         int cnt = 0;
    43         int nr = r + chr[i], nc = c + chc[i];//黑方将军位置不判断
    44         for (; 0 < nr&&nr <= 10 && 0 < nc&&nc <= 9; nr += chr[i], nc += chc[i]){
    45             if (board[nr][nc]){
    46                 if ((board[nr][nc] == 'R' || board[nr][nc] == 'G')&&cnt==0) return 1;
    47                 else  if (board[nr][nc] == 'C'&&cnt==1)  return 1;
    48                 cnt++;
    49             }
    50         }
    51     }
    52 
    53     //判断是否被红方的马将军
    54     for (int i = 0; i < 8; i++)
    55     {
    56         int nr = r + hr[i], nc = c + hc[i];
    57         if (0 < nr&&nr <= 10 && 0 < nc&&nc <= 9 &&
    58             board[nr][nc] == 'H'&&!board[r + hlr[i]][c + hlc[i]])
    59             return 1;
    60     }
    61     return 0;
    62 }

     

  • 相关阅读:
    全网首发|阿里资深技术专家数仓调优经验分享(上)
    用跨进程子类化技术实现对其它进程消息的拦载
    字符串与16进制互转
    Windows消息前缀
    Delphi 关于钩子函数HOOK (二)
    ACCESS SQL语法参考
    从内存中加载并运行exe
    浅谈Delphi中进程间的数据共享
    字符串排序等算法
    利用内存映射文件在两个进程间共享数据
  • 原文地址:https://www.cnblogs.com/cumulonimbus/p/5184725.html
Copyright © 2011-2022 走看看