zoukankan      html  css  js  c++  java
  • uva 1589 by sixleaves

    坑爹的模拟题目。自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习。贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子。到网上参考别人的代码才发先这么简单的办法,自己尽然想不到。多加练习,总结下该题目吧。
      1 #include <stdio.h>
      2 #include <string.h>
      3 #define N 12
      4 
      5 char brd[N][N];
      6 int dx[] = {1,-1,0,0}, dy[] = {0,0,1,-1};
      7 int hx[] = {-2,-1,-2,-1,1,2,1,2};
      8 int hy[] = {-1,-2,1,2,-2,-1,2,1};
      9 int tx[] = {-1,-1,-1,-1,1,1,1,1};
     10 int ty[] = {-1,-1,1,1,-1,-1,1,1};
     11 int cr[2], cc[2];
     12 
     13 
     14 int check(intint);
     15 
     16 int main() {
     17     
     18     int t, bX, bY;
     19     char s[5];
     20     while (scanf("%d%d%d",&t, &bX, &bY), t || bX || bY) {
     21         
     22         memset(brd, 0, sizeof(brd));
     23         cr[0] = cc[0] = cr[1] = cc[1] = 0;
     24         
     25         for (int i = 0; i < t; i++) {
     26             
     27             int rX, rY;
     28             scanf("%s%d%d", s, &rX, &rY);
     29             if ('C' == s[0]) {
     30                 
     31                 if (cr[0]) cr[1] = rX, cc[1] = rY;
     32                 else cr[0] = rX, cc[0] = rY;
     33             }
     34             brd[rX][rY] = s[0];
     35         }
     36         
     37         // 判断是否四个方向都会被将军,或者无路可走的方向也认为是被将军
     38         int cnt = 0;
     39         for (int i = 0; i < 4; i++)
     40             cnt += check(bX + dx[i], bY + dy[i]);
     41         
     42         if (cnt < 4) puts("NO");
     43         else puts("YES");
     44         
     45     }
     46     
     47 }
     48 
     49 int check(int r, int c) {
     50     
     51     // 越界,无路可走
     52     if (r < 1 || r > 3 || c < 4 || c > 6) return 1;
     53     
     54     
     55     // 因为我们没法保证车中间有没有其他棋子,所以必须从近到远一格格检查
     56     // 车在同行且中间无棋子
     57     for (int j = c - 1; j > 0; j--) {
     58         if (brd[r][j])
     59             if ('R' == brd[r][j]) return 1;
     60             else break;
     61     }
     62     
     63     for (int j = c + 1; j <= 9; j++) {
     64         
     65         if (brd[r][j])
     66             if ('R' == brd[r][j]) return 1;
     67             else break;
     68     }
     69     
     70     
     71     // 车在同列且中间物棋子
     72     for (int j = r - 1; j > 0; j--) {
     73         
     74         if (brd[j][c])
     75             if ('R' == brd[j][c]) return 1;
     76             else break;
     77         
     78     }
     79     
     80     for (int j = r + 1; j <=10; j++) {
     81         
     82         if (brd[j][c])
     83             if ('R' == brd[j][c] || 'G' == brd[j][c]) return 1;
     84             else break;
     85         
     86     }
     87     
     88     // 炮将军
     89     for (int k = 0; k < 2; k++) {
     90         
     91         // 行有炮
     92         if (r == cr[k]) {
     93             int cnt = 0;
     94             for (int j = c - 1; j > cc[k]; j--) if (brd[r][j]) ++cnt;
     95             if (cnt == 1) return 1;
     96             cnt = 0;
     97             for (int j = c + 1; j < cc[k]; j++) if (brd[r][j]) ++cnt;
     98             if (cnt == 1) return 1;
     99             
    100         }
    101         
    102         // 列有跑
    103         if (c == cc[k]) {
    104             int cnt = 0;
    105             for (int j = r - 1; j > cr[k]; j--) if (brd[j][c]) ++cnt;
    106             if (cnt == 1) return 1;
    107             cnt = 0;
    108             for (int j = r + 1; j < cr[k]; j++) if (brd[j][c]) ++cnt;
    109             if (cnt == 1) return 1;
    110         }
    111         
    112         
    113     }
    114     
    115     // 马将军,马的8个方位
    116     for(int k = 0; k < 8; ++k) {
    117         
    118         int tr = r + hx[k], tc = c + hy[k];
    119         if (tr < 1 || tr > 10 || tc < 1 || tc > 9) continue;
    120         if (brd[tr][tc] == 'H' && (!brd[r + tx[k]][c + ty[k]]))
    121             return 1;
    122         
    123     }
    124     return 0;
    125 }
  • 相关阅读:
    使用清华源进行pip install
    BERT和ULMFIT embedding比较文本分类结果
    Ubuntu16.04更新python3.5到python3.7
    base64方式显示控件
    在使用redis做缓存后,mybatis的延迟加载失效
    springboot:redis反序列化发生类型转换错误
    eclipse :代码自动补全不生效解决办法
    微信扫码支付:问题集锦
    微信扫码支付(4):统一下单
    微信扫码支付(3):获取验签秘钥
  • 原文地址:https://www.cnblogs.com/objectc/p/4553504.html
Copyright © 2011-2022 走看看