总结:这个代码可就长太多了- -
题目是要求我们看看能否将死对面黑将,炮,帅,车在逻辑上的移动我们可以归为一类,但就是炮呢在遇到自己的同色棋子之前的位置他是无法进行进攻的,所以我们需要创建一个attack来表示这个到底是帅,车还是炮。他们移动是模拟四个方向的移动。马和黑将单独写一块代码来代替他们的移动。
注意的点
1.炮在进入攻击状态后,帅,车在碰到红子是还是要把他吃掉的,但不能够在下去。碰到黑将是不用管,直接继续改变该条方向上的状态
2.炮在非攻击状态下碰到黑将是无法吃到的哦。

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 11;
char board[maxn][maxn];
bool is[maxn][maxn];
int n, x, y;
struct cmd
{int x1, y1;char machine;
}cmd[100];
void king(int x, int y, bool tape)//模拟帅,车,炮的移动
{bool attack = tape;//是否处于攻击表示状态for (int i = x - 1;i >= 1;i--){if (board[i][y] != 'E'&&board[i][y] != '0')//这个方向上遇到了红色棋子如果不在攻击状态就进入攻击状态,否则可以吃到这一位置然后退出{if (attack){is[i][y] = true;break;}else{attack = 1;}}else{if (attack){is[i][y] = true;}}}attack = tape;for (int i = x    + 1; i!=11;i++)//一样{if (board[i][y] != 'E'&&board[i][y] != '0'){if (attack){is[i][y] = true;break;}else{attack = 1;}}else{if (attack){is[i][y] = true;}}}attack = tape;for (int i = y+1;i !=10;i++){if (board[x][i] != 'E'&&board[x][i] != '0'){if (attack){is[x][i] = true;break;}else{attack = 1;}}else{if (attack){is[x][i] = true;}}}attack = tape;for (int i = y-1;i != 0;i--){if (board[x][i] != 'E'&&board[x][i] != '0'){if (attack){is[x][i] = true;break;}else{attack = 1;}}else{if (attack){is[x][i] = true;}}}
}
void horse(int x,int y)//模拟马的移动啦
{if (x >= 3 && board[x-1][y] == '0')//马走日子型所以有四个方向,board[x-1][y] == '0'判断是否是别了马脚{if (y != 1){is[x - 2][y - 1] = true;}if (y != 9){is[x - 2][y + 1] = true;}}if (x<=8 && board[x+1][y] == '0'){if (y != 1){is[x + 2][y - 1] = true;}if (y != 9){is[x + 2][y + 1] = true;}}if (y >= 3 && board[x][y - 1] == '0'){if (x != 1){is[x - 1][y - 2] = true;}if (x != 10){is[x + 1][y - 2] = true;}}if (y <=7&& board[x][y +1] == '0'){if (x != 1){is[x - 1][y +2] = true;}if (x != 10){is[x + 1][y +2] = true;}}
}
bool judge()//这就来判断黑子是否还能存活
{if (x == 1 || x == 2)//各个方向看看能不能存活{if (is[x + 1][y] == false){return false;}}if (x == 2 || x == 3){if (is[x - 1][y] == false){return false;}}if (y == 4 || y == 5){if (is[x][y + 1] == false){return false;}}if (y == 5 || y == 6){if (is[x][y - 1] == false){return false;}}return true;
}
void choose(char a,int x,int y)//一个来判断棋子的函数
{if (a == 'R'||a=='G'){king(x, y, true);}else if (a == 'H'){horse(x, y);}else if (a == 'C'){king(x, y, false);}
}
int main()
{while (scanf("%d %d %d", &n, &x, &y) != EOF && n != 0){memset(board, '0', sizeof(board));memset(is, 0, sizeof(is));board[x][y] = 'E';int n1 = n;while(n--){char categroy;int x1, y1;cin >> categroy >> x1 >> y1;board[x1][y1] = categroy;cmd[n].x1 = x1;//因为是所有棋子入盘后进行判断所以要来一个结构体先来存储棋子。cmd[n].y1 = y1;cmd[n].machine = categroy;}while (n1--){choose(cmd[n1].machine, cmd[n1].x1, cmd[n1].y1);}/*for (int i = 1;i < 11;i++)//测试用例{for (int j = 1;j < 10;j++){cout << is[i][j] << " ";}cout << endl;}for (int i = 1;i < 11;i++){for (int j = 1;j < 10;j++){cout << board[i][j] << " ";}cout << endl;}*/bool bo = judge();if (bo){cout << "YES" << endl;}else{cout << "NO" << endl;}}
}

象棋 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 象棋

    题意: 给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军. 分析: 分情况处理, 车 马 炮, 红将情况跟车是一样的. 建一个数组board保 ...

  4. UVA1589 象棋 + UVA 220 黑白棋

    UVA1589 象棋 象棋是中国最受欢迎的两人桌游之一.该游戏代表了两支军队之间的战斗,目的是捕获敌人的"将军". 现在我们介绍一些象棋的基本规则. 象棋在10×9的棋盘上演奏,并 ...

  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. 解决Couldn't resolve host 'mirrorlist.centos.org
  2. 可视化-echarts流向图制作及recharts
  3. javascript时间格式format函数,js日期格式化函数
  4. mac nginx 非brew安装_Nginx服务器环境手动安装Discuz! Q非详细教程
  5. 一个前端UI资源共享网站
  6. 2020年系统集成项目管理工程师上午真题及答案(一)
  7. CSS内联样式的使用,实战篇
  8. ClickHouse数据库介绍
  9. 树莓派41/100- Pico控制触摸开关模块TTP223
  10. python递归函数例子_Python递归函数经典案例-汉诺塔问题
  11. PHP通过推广二维码追溯统计用户来源
  12. c 语言编程 脚本之家,wincc c脚本实例wincc赋值程序
  13. 用Python处理EXCEL表格(Openpyxl)
  14. 应用程序图标变成白色
  15. html的frame怎么使用方法,HTML frame标签怎么用?frame标签的具体使用实例
  16. 那个耍了 Google 的天才工程师,又摆了 Uber 一道
  17. 2022秋季 电影&书单
  18. 著名画家孙王平作品欣赏
  19. docker本地镜像下载及加载
  20. 【Vue项目搭建】修改【若依框架】的侧边栏、导航栏、面包屑样式、修改全局页面样式

热门文章

  1. vue中上传图片并裁剪
  2. 显微血管减压术看似简单却很考验医生,不应让患者受手术失败之苦
  3. 数据库整理+SQL笔试2道
  4. 行为识别笔记:HOG,HOF与MBH特征
  5. jzoj5167. 下蛋爷(AC自动机)
  6. python菜鸟驿站-Python XML 解析
  7. UVa 10315 - Poker Hands
  8. Ubuntu Desktop 启用远程桌面(Vino和TigerVNC方式)
  9. @Modifying和@Transactional
  10. OrchardCore