Uva 1589 Xiangqi 判断是否将死
来源:互联网 发布:c语言的头文件怎么写 编辑:程序博客网 时间:2024/06/05 10:07
UVa 1589 Xiangqi
简单分析
- 题目是让我们检查红方是不是把黑方将死
- 首先要考虑黑方是不是已经和红方见面,如果见面了,黑方直接胜利
- 接下来就要考虑每个红子可以走的地方了,其中要注意黑方将可能会吃掉红子,所以我用了两个二维数组,一个保存之前的状态,一个保存黑方将移动后的状态。
- 对移动后的棋盘进行标记(为了标记方便,黑方将不会显示在棋盘,因为只有一个棋子了)将红方棋子能吃的位置全部标记成特定字符,我的是‘D’
- 另外,帅可以当作在黑方家里移动的车处理
代码
WA了多发终于过了。。。 代码有点丑
#include<iostream>#include<cstring>using namespace std;char map0[11][10];char map[11][10];int gx, gy, rgx, rgy;int n, x, y;char c;//用于复制之前的状态到标记棋盘void copy() { for (int i = 1; i < 11; i++) { for (int j = 1; j < 10; j++) { map[i][j] = map0[i][j]; } }}//标记棋盘void eat(char c, int x, int y) { switch (c) { //将 case'G': { int endx = 0; for (int i = x - 1; i > 0; i--) { if (map[i][y] != 'D' && map[i][y] != 'A') { endx = i; break; } } for (int i = 3; i > endx; i--) { if (map[i][y] == 'A') { map[i][y] = 'D'; } } break; } //车 case'R':{ int endx = 0; int endy = 0; //up for (int i = x - 1; i >= 1; i--) { if (map[i][y] != 'D' && map[i][y] != 'A') { endx = i; break; } } for (int i = endx + 1; i < x; i++) { if (map[i][y] == 'A') { map[i][y] = 'D'; } } //down endx = 11; for (int i = x + 1; i < 11; i++) { if (map[i][y] != 'D' && map[i][y] != 'A') { endx = i; break; } } for (int i = x + 1; i < endx; i++) { if (map[i][y] == 'A') { map[i][y] = 'D'; } } //left for (int i = y - 1; i > 0; i--) { if (map[x][i] != 'D' && map[x][i] != 'A') { endy = i; break; } } for (int i = endy + 1; i < y; i++) { if (map[x][i] == 'A') { map[x][i] = 'D'; } } //right endy = 10; for (int i = y + 1; i < 10; i++) { if (map[x][i] != 'D' && map[x][i] != 'A') { endy = i; break; } } for (int i = y + 1; i < endy; i++) { if (map[x][i] == 'A') { map[x][i] = 'D'; } } break; } //炮 case'C': { int cnt = 0; int startx, starty, endx = 0, endy = 0; //up for (int i = x - 1; i > 0; i--) { if ((map[i][y] != 'A' && map[i][y] != 'D')) { cnt++; if (cnt == 1) { startx = i; } if (cnt == 2) { endx = i; break; } } } if (cnt) { for (int i = endx + 1; i < startx; i++) { if (map[i][y] == 'A') { map[i][y] = 'D'; } } } //down cnt = 0; endx = 11; for (int i = x + 1; i < 11; i++) { if ((map[i][y] != 'A' && map[i][y] != 'D')) { cnt++; if (cnt == 1) { startx = i; } if (cnt == 2) { endx = i; break; } } } if (cnt) { for (int i = startx + 1; i < endx; i++) { if (map[i][y] == 'A') { map[i][y] = 'D'; } } } //left cnt = 0; for (int i = y - 1; i >= 1; i--) { if (map[x][i] != 'A' && map[x][i] != 'D') { cnt++; if (cnt == 1) { starty = i; } if (cnt == 2) { endy = i; break; } } } if (cnt) { for (int i = endy + 1; i < starty; i++) { if (map[x][i] == 'A') { map[x][i] = 'D'; } } } //right cnt = 0; endy = 10; for (int i = y + 1; i < 10; i++) { if (map[x][i] != 'A' && map[x][i] != 'D') { cnt++; if (cnt == 1) { starty = i; } if (cnt == 2) { endy = i; break; } } } if (cnt) { for (int i = starty + 1; i < endy; i++) { if (map[x][i] == 'A') { map[x][i] = 'D'; } } } break; } //马 case 'H': { //up if (x - 2 > 0 && (map[x - 1][y] == 'D' || map[x - 1][y] == 'A')) { if (y - 1 > 0 && map[x - 2][y - 1] == 'A') { map[x - 2][y - 1] = 'D'; } if (y + 1 < 10 && map[x - 2][y + 1] == 'A') { map[x - 2][y + 1] = 'D'; } } //down if (x + 2 < 11 && (map[x + 1][y] == 'D' || map[x + 1][y] == 'A')) { if (y - 1 > 0 && map[x + 2][y - 1] == 'A') { map[x + 2][y - 1] = 'D'; } if (y + 1 < 10 && map[x + 2][y + 1] == 'A') { map[x + 2][y + 1] = 'D'; } } //left if (y - 2 > 0 && (map[x][y - 1] == 'D' || map[x][y - 1] == 'A')) { if (x - 1 > 0 && map[x - 1][y - 2] == 'A') { map[x - 1][y - 2] = 'D'; } if (x + 1 < 11 && map[x + 1][y - 2] == 'A') { map[x + 1][y - 2] = 'D'; } } //right if (y + 2 > 0 && (map[x][y + 1] == 'D' || map[x][y + 1] == 'A')) { if (x - 1 > 0 && map[x - 1][y + 2] == 'A') { map[x - 1][y + 2] = 'D'; } if (x + 1 < 11 && map[x + 1][y + 2] == 'A') { map[x + 1][y + 2] = 'D'; } } break; } default: break; }}void deal() { for (int i = 1; i < 11; i++) { for (int j = 1; j < 10; j++) { eat(map[i][j], i, j); } }}bool canMove(int x, int y) { return x >= 1 && x <= 3 && y >= 4 && y <= 6;}//将的移动int dx[] = { 1, -1, 0, 0 };int dy[] = { 0, 0, 1, -1 };bool isDead() { for (int i = 0; i < 4; i++) { if (canMove(gx + dx[i], gy + dy[i])) { copy(); //可能吃掉了红方一个棋子 map[gx + dx[i]][gy + dy[i]] = 'A'; deal(); if (map[gx + dx[i]][gy + dy[i]] != 'D') return false; } } return true;}int main() { while (cin >> n >> gx >> gy && n) { memset(map0, 'A', sizeof(map0)); for (int i = 0; i < n; i++) { cin >> c >> x >> y; map0[x][y] = c; if (x == 'G') { rgx = x; rgy = y; } } //将帅已经见面 bool isMet = false; if (rgy == gy) { for (int i = rgx - 1; i <= gx; i++) { if (map0[i][rgy] != 'A') { isMet = map0[i][rgy] == 'G'; } } } if (isMet) { cout << "NO" << endl; } else { deal(); if (isDead()) { cout << "YES" << endl; } else { cout << "NO" << endl; } } }}
阅读全文
0 0
- Uva 1589 Xiangqi 判断是否将死
- UVa 1589 象棋 xiangqi 问题。 判断是否将军致死。
- uva 1589 - Xiangqi
- UVa 1589 - Xiangqi
- UVa 1589 - Xiangqi
- UVA-1589Xiangqi
- UVA - 1589 Xiangqi (模拟)
- Uva 1589 Xiangqi
- Uva - 1589 - Xiangqi
- uva 1589Xiangqi
- UVA 1589 Xiangqi
- UVA - 1589 Xiangqi (象棋)
- uva 1589 xiangqi
- (模拟) uva 1589 Xiangqi
- UVa 1589 Xiangqi
- UVa 1589 Xiangqi
- Uva 1589 xiangqi
- UVA 1589 xiangqi
- 刷清橙OJ--A1084.快速傅里叶变换
- 2017-04-26 每日一记 C语言API
- 以太坊连载(一):以太坊到底是什么?
- SparkMLlib之02-Pipeline介绍及其应用
- 2017/6/19日常总结
- Uva 1589 Xiangqi 判断是否将死
- 水——洛谷P1407 工资
- 快速排序中的套路
- 以太坊连载(二):如何使用Homestead文档及以太坊路线图
- Ubuntu中两个Python时,怎么使用pip
- 自定义状态机
- java炒冷饭系列07 java标准异常
- 基于Spring的AOP编程
- QTabWidget样式案例