题意:

给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军。

分析:

分情况处理, 车 马 炮, 红将情况跟车是一样的。

建一个数组board保存棋局, 然后建一个数组moveable用来算出黑将当前位置能走的格子(1可走, 0不可走, 一开始都是1), 判断一下黑将上下左右四个方位是否能走, 而且走了之后算一下当前位置moveable是否0即可。

代码:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 int N, bx, by;
  4 int board[11][10];
  5 int tboard[11][10];
  6 int movable[11][10];
  7 struct CHESS
  8 {
  9     char name;
 10     int x, y;
 11 }chess[10];
 12 void Chariot(int x, int y){
 13     for(int i = x - 1; i >= 1; i--){
 14         movable[i][y] = 0;
 15         if(tboard[i][y] && tboard[i][y] != 'B')
 16             break;
 17     }
 18     for(int i = x + 1; i <= 10; i++){
 19         movable[i][y] = 0;
 20         if(tboard[i][y] && tboard[i][y] != 'B')
 21             break;
 22     }
 23     for(int i = y + 1; i <= 9; i++){
 24         movable[x][i] = 0;
 25         if(tboard[x][i] && tboard[x][i] != 'B')
 26             break;
 27     }
 28     for(int i = y - 1; i >= 1; i --){
 29         movable[x][i] = 0;
 30         if(tboard[x][i] && tboard[x][i] != 'B')
 31             break;
 32     }
 33 }
 34 void Cannon(int x, int y)
 35 {
 36     for(int i = x - 1; i >= 1; i --){
 37         if(tboard[i][y] && tboard[i][y] != 'B'){
 38             for(int j = i - 1; j >= 1; j--){
 39                 movable[j][y] = 0;
 40                 if(tboard[j][y] && tboard[j][y] != 'B')
 41                     break;
 42             }
 43             break;
 44         }
 45     }
 46     for(int i = x + 1; i <= 10 ; i++){
 47           if(tboard[i][y] && tboard[i][y] != 'B'){
 48             for(int j = i+1; j <= 10; j++){
 49                 movable[j][y] = 0;
 50                 if(tboard[j][y] && tboard[j][y] != 'B')
 51                     break;
 52             }
 53             break;
 54         }
 55     }
 56     for(int i = y - 1; i >= 1; i--){
 57         if(tboard[x][i] && tboard[x][i] != 'B'){
 58             for(int j = i - 1; j >= 1; j--){
 59                 movable[x][j] = 0;
 60                 if(tboard[x][j] && tboard[j][y] != 'B')
 61                     break;
 62             }
 63             break;
 64         }
 65     }
 66
 67      for(int i = y + 1; i <= 9; i++){
 68         if(tboard[x][i] && tboard[x][i] != 'B'){
 69             for(int j = i + 1; j <= 9; j++){
 70                 movable[x][j] = 0;
 71                 if(tboard[x][j] && tboard[j][y] != 'B')
 72                     break;
 73             }
 74             break;
 75         }
 76     }
 77
 78 }
 79 int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};//上右下左
 80 int dir2[8][2] = {{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
 81 void Horse(int x, int y)
 82 {
 83     for(int i = 0; i < 4; i++){
 84         int tx = x, ty = y;
 85         tx += dir[i][0];
 86         ty += dir[i][1];
 87         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9);
 88         else continue;
 89         if(tboard[tx][ty]) continue;
 90         tx = x; ty = y;
 91         tx += dir2[(i+1)*2 - 2][0];
 92         ty += dir2[(i+1)*2 - 2][1];
 93         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9)
 94             movable[tx][ty] = 0;
 95         tx = x; ty = y;
 96         tx += dir2[(i+1)*2 - 1][0];
 97         ty += dir2[(i+1)*2 - 1][1];
 98         if(tx >= 1 && ty >= 1 && tx <= 10 && ty <= 9)
 99             movable[tx][ty] = 0;
100     }
101 }
102 int main()
103 {
104
105     while(scanf("%d %d %d", &N, &bx, &by) != EOF){
106         if(N == 0) break;
107         memset(board, 0, sizeof(board));
108         board[bx][by] = 'B';
109         for(int i = 1; i <= 10; i++){
110             for(int j = 1; j<= 9; j++){
111                 movable[i][j] = 1;
112             }
113         }
114
115         for(int i = 0; i < N; i++){
116             int x, y;
117             char name;
118             scanf(" %c", &name);
119             scanf("%d %d", &x, &y);
120             board[x][y] = name;
121         }
122         int ok = 0;
123         for(int i = 0; i < 4; i++)
124         {
125             int tx = bx, ty = by;
126             tx += dir[i][0];
127             ty += dir[i][1];
128             if(tx >= 1 && tx <= 3 && ty >= 4 && ty <= 6);
129             else continue;
130             for(int k = 1; k <= 10; k++){
131                 for(int j = 1; j <= 10; j++){
132                     tboard[k][j] = board[k][j];
133                 }
134             }
135             tboard[tx][ty] = 'B';
136
137             for(int k = 1; k <= 10; k++){
138                 for(int j = 1; j<= 9; j++){
139                     movable[k][j] = 1;
140                 }
141             }
142
143             for(int k = 1; k <= 10; k++){
144                 for(int j = 1; j <= 9; j++){
145                     switch(tboard[k][j]){
146                         case 'G':
147                             Chariot(k,j);
148                             break;
149                         case 'R':
150                             Chariot(k,j);
151                             break;
152                         case 'H':
153                             Horse(k,j);
154                             break;
155                         case 'C':
156                             Cannon(k,j);
157                             break;
158                     }
159                 }
160             }
161
162             if(movable[tx][ty])
163                 ok = 1;
164         }
165         printf("%s\n", ok ? "NO":"YES");
166
167     }
168     return 0;
169 }

转载于:https://www.cnblogs.com/Jadon97/p/7147621.html

UVA 1589 象棋相关推荐

  1. UVA - 1589 ​​​​​​​Xiangqi

    Xiangqi UVA - 1589 题目传送门 解决方法:判断黑棋是否能有可以下的地方 AC代码: #include <cstdio> #include <iostream> ...

  2. Xiangqi UVA - 1589(蛮好玩的中国象棋~·)

    题目: 给出一个中国象棋残局,黑方只有将,红方有仅包含马車炮帅在内的n(2≤n≤7)个棋子,且黑方已被将军,输出是否已被将死(无路可走) R(车) C(炮) H(马) G(帅)(将) https:// ...

  3. 象棋 UVA 1589

    总结:这个代码可就长太多了- - 题目是要求我们看看能否将死对面黑将,炮,帅,车在逻辑上的移动我们可以归为一类,但就是炮呢在遇到自己的同色棋子之前的位置他是无法进行进攻的,所以我们需要创建一个atta ...

  4. Uva 11538 象棋中的皇后

    题目链接:https://uva.onlinejudge.org/external/115/11538.pdf 两个皇后,n行m列,互相攻击的情况有多少种? 分析: 1.同一行的情况:n*m(m-1) ...

  5. UVA 1589 Xiangqi——模拟

    模拟题,我的做法是先让黑将分别上下左右移动,对每一种情况  先判断是否能被马将死(列举8种情况),然后判断是否能被 将 车 炮 将死(以黑将为中心十字展开,判断是否有 将 车 炮) 注意: 1.开局两 ...

  6. Xianqi UVa 1589

    这道题是一道模拟题,就是用来判断黑的一方能不能存活,所以就将黑的将军所有合法的移动情况都表示出来,看一看黑将军是否被红的将军,就可以了,主要注意的以下几点: 1.如果黑的能够直接杀死红的,那就输出 N ...

  7. uva 1589 - Xiangqi

    把所有红方的攻击范围标记出来,判断黑方四个方向是否在红方范围内 #include <iostream> #include <cstdio> #include <vecto ...

  8. UVA 1589 java

    import java.util.*;class Main2 {static char[][] cb=new char[12][10];//放置所有棋子的棋盘static char[][] ab=ne ...

  9. UVa Online Judge 西班牙Valladolid 在线判官 和 uDebug使用简单教程

    udebug使用在后面 https://uva.onlinejudge.org/ 1.这是主界面,如果你还没有账号,那么就点击图中的register. 2.然后就是填写信息,邮箱要用gmail,信息填 ...

最新文章

  1. redis的安装以及常见运用场景
  2. (管道| / 重定向 / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
  3. Vista中使用率最高的11条命令
  4. 已知服务器ftp的账号密码,求解数据库表的内容
  5. f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码
  6. Codeforces Round #149 (Div. 2)【AK】
  7. Spring JDBC数据库连接池设置
  8. 快速读取内存文件-内存映射文件的方法
  9. 计算机系统及原理pdf,计算机系统组成及工作原理题目.pdf
  10. IIS7 请求筛选模块被配置为拒绝超过请求内容长度的请求
  11. css常用样式大全集锦
  12. 【产品志】华硕 ARUA 的 ARGB 方案
  13. Cocos Creator | 导航网格自动寻路:多角色寻路、动态规避障碍物、上/下坡度等
  14. 盘点时间管理方面的一些方法及工具
  15. loadrunner—集合点rendezvous
  16. +initialize方法的调用时机
  17. python立方根求解_python 二分查找(立方根)
  18. android手机联调,Android第三课 联调华为手机
  19. WebDAV是什么,有哪些支持webdav的网盘和工具?
  20. Pytorch官方文档英语翻译

热门文章

  1. 51单片机学习笔记【七】——蜂鸣器和继电器
  2. migo初始化库存 s4_SAP项目用户操作手册-MIGO货物移动.docx
  3. 视频提取关键帧工具类KeyFramesExtractUtils.py,动态支持三种取帧方式,关键参数可配置,代码经过优化处理,效果和性能更好。
  4. 应届毕业生找java初级开发工作需要掌握哪些知识或者技术?
  5. 企业内网防火墙搭建实验
  6. 联考素描头像怎么才能画到高分?联考新手必看!
  7. 本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
  8. linux下的source命令(.命令)解释及应用
  9. java发送s mime邮件_SpringBoot集成实现各种邮件发送
  10. DSP—2812、28335串行通信接口SCI