UVA 1589 象棋
题意:
给出一个黑方的将, 然后 红方有 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 象棋相关推荐
- UVA - 1589 Xiangqi
Xiangqi UVA - 1589 题目传送门 解决方法:判断黑棋是否能有可以下的地方 AC代码: #include <cstdio> #include <iostream> ...
- Xiangqi UVA - 1589(蛮好玩的中国象棋~·)
题目: 给出一个中国象棋残局,黑方只有将,红方有仅包含马車炮帅在内的n(2≤n≤7)个棋子,且黑方已被将军,输出是否已被将死(无路可走) R(车) C(炮) H(马) G(帅)(将) https:// ...
- 象棋 UVA 1589
总结:这个代码可就长太多了- - 题目是要求我们看看能否将死对面黑将,炮,帅,车在逻辑上的移动我们可以归为一类,但就是炮呢在遇到自己的同色棋子之前的位置他是无法进行进攻的,所以我们需要创建一个atta ...
- Uva 11538 象棋中的皇后
题目链接:https://uva.onlinejudge.org/external/115/11538.pdf 两个皇后,n行m列,互相攻击的情况有多少种? 分析: 1.同一行的情况:n*m(m-1) ...
- UVA 1589 Xiangqi——模拟
模拟题,我的做法是先让黑将分别上下左右移动,对每一种情况 先判断是否能被马将死(列举8种情况),然后判断是否能被 将 车 炮 将死(以黑将为中心十字展开,判断是否有 将 车 炮) 注意: 1.开局两 ...
- Xianqi UVa 1589
这道题是一道模拟题,就是用来判断黑的一方能不能存活,所以就将黑的将军所有合法的移动情况都表示出来,看一看黑将军是否被红的将军,就可以了,主要注意的以下几点: 1.如果黑的能够直接杀死红的,那就输出 N ...
- uva 1589 - Xiangqi
把所有红方的攻击范围标记出来,判断黑方四个方向是否在红方范围内 #include <iostream> #include <cstdio> #include <vecto ...
- UVA 1589 java
import java.util.*;class Main2 {static char[][] cb=new char[12][10];//放置所有棋子的棋盘static char[][] ab=ne ...
- UVa Online Judge 西班牙Valladolid 在线判官 和 uDebug使用简单教程
udebug使用在后面 https://uva.onlinejudge.org/ 1.这是主界面,如果你还没有账号,那么就点击图中的register. 2.然后就是填写信息,邮箱要用gmail,信息填 ...
最新文章
- redis的安装以及常见运用场景
- (管道| / 重定向 / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
- Vista中使用率最高的11条命令
- 已知服务器ftp的账号密码,求解数据库表的内容
- f2py支持在fortran语言中调用其他Fortran函数或C代码或Python代码
- Codeforces Round #149 (Div. 2)【AK】
- Spring JDBC数据库连接池设置
- 快速读取内存文件-内存映射文件的方法
- 计算机系统及原理pdf,计算机系统组成及工作原理题目.pdf
- IIS7 请求筛选模块被配置为拒绝超过请求内容长度的请求
- css常用样式大全集锦
- 【产品志】华硕 ARUA 的 ARGB 方案
- Cocos Creator | 导航网格自动寻路:多角色寻路、动态规避障碍物、上/下坡度等
- 盘点时间管理方面的一些方法及工具
- loadrunner—集合点rendezvous
- +initialize方法的调用时机
- python立方根求解_python 二分查找(立方根)
- android手机联调,Android第三课 联调华为手机
- WebDAV是什么,有哪些支持webdav的网盘和工具?
- Pytorch官方文档英语翻译
热门文章
- 51单片机学习笔记【七】——蜂鸣器和继电器
- migo初始化库存 s4_SAP项目用户操作手册-MIGO货物移动.docx
- 视频提取关键帧工具类KeyFramesExtractUtils.py,动态支持三种取帧方式,关键参数可配置,代码经过优化处理,效果和性能更好。
- 应届毕业生找java初级开发工作需要掌握哪些知识或者技术?
- 企业内网防火墙搭建实验
- 联考素描头像怎么才能画到高分?联考新手必看!
- 本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
- linux下的source命令(.命令)解释及应用
- java发送s mime邮件_SpringBoot集成实现各种邮件发送
- DSP—2812、28335串行通信接口SCI