POJ4001/HDU4121 Xiangqi 大模拟
来源:互联网 发布:java源码阅读工具 编辑:程序博客网 时间:2024/06/05 19:36
题目传送门:http://poj.org/problem?id=4001
这其实就是一道无脑模拟题。。首先黑方将有四个位置可以走(上下左右)(如果可以走的话),那么就分别模拟走到这四个位置,然后判断会不会被红方将军。如果被红方以任一方式将军则在这种情况下被将死。如果四种走位都会被将死,则输出YES,即黑方彻底玩完。一个我认为的Trick是如果一开始黑方还没走的时候就可以飞将红方,那么此时直接输出NO就好了(不用走,直接黑方赢了),测试样例应该是没有这样的样例的,不过我还是写上了,严谨一些。
真-Trick:
1、输入的时候用cin,输入里可能有乱七八糟的空格,用getchar()的话会出事
2、黑将走的时候不用考虑走的位置有没有红方的棋,因为如果有的话直接就相当于把它吃掉了,所以不用考虑有没有棋在那个格子里,直接走就是了。
3、注意马走的时候蹩马的情况,我一开始从黑方的视角判断那个蹩马的位置,看反了,WA了很久。应该从红方的视角来看。还是太不细心了,因此浪费了很多时间检查。
#include<cstdio>#include<cstring>#include<iostream>using namespace std;char Map[15][15];bool ma(int x, int y){ //8种潜在被将可能 //1左上 if (x-1 >= 1 && y-2 >= 1 && Map[x-1][y-2] == 'H' && Map[x-1][y-1] == '0') return true; //2上左 if (x-2 >= 1 && y-1 >= 1 && Map[x-2][y-1] == 'H' && Map[x-1][y-1] == '0') return true; //3左下 if (x+1 <= 10 && y-2 >= 1 && Map[x+1][y-2] == 'H' && Map[x+1][y-1] == '0') return true; //4下左 if (x+2 <= 10 && y-1 >= 1 && Map[x+2][y-1] == 'H' && Map[x+1][y-1] == '0') return true; //5右上 if (x-1 >= 1 && y+2 <= 9 && Map[x-1][y+2] == 'H' && Map[x-1][y+1] == '0') return true; //6上右 if (x-2 >= 1 && y+1 <= 9 && Map[x-2][y+1] == 'H' && Map[x-1][y+1] == '0') return true; //7右下 if (x+1 <= 10 && y+2 <= 9 && Map[x+1][y+2] == 'H' && Map[x+1][y+1] == '0') return true; //8下右 if (x+2 <= 10 && y+1 <= 9 && Map[x+2][y+1] == 'H' && Map[x+1][y+1] == '0') return true; return false;}bool che(int x, int y){ //上 for (int i = x-1; i >= 1; i--) { if (Map[i][y] != '0') { if (Map[i][y] == 'R') return true; else break; } } //下 for (int i = x+1; i <= 10; i++) { if (Map[i][y] != '0') { if (Map[i][y] == 'R') return true; else break; } } //左 for (int j = y-1; j >= 1; j--) { if (Map[x][j] != '0') { if (Map[x][j] == 'R') return true; else break; } } //右 for (int j = y+1; j <= 9; j++) { if (Map[x][j] != '0') { if (Map[x][j] == 'R') { return true; } else break; } } return false;}bool pao(int x, int y){ //上 for (int i = x-1; i >= 1; i--) { if (Map[i][y] != '0') { for (int ii = i-1; ii >= 1; ii--) { if (Map[ii][y] != '0') { if (Map[ii][y] == 'C') return true; else break; } } break; } } //下 for (int i = x+1; i <= 10; i++) { if (Map[i][y] != '0') { for (int ii = i+1; ii <= 10; ii++) { if (Map[ii][y] != '0') { if (Map[ii][y] == 'C') return true; else break; } } break; } } //左 for (int j = y-1; j >= 1; j--) { if (Map[x][j] != '0') { for (int jj = j-1; jj >= 1; jj--) { if (Map[x][jj] != '0') { if (Map[x][jj] == 'C') return true; else break; } } break; } } //右 for (int j = y+1; j <= 9; j++) { if (Map[x][j] != '0') { for (int jj = j+1; jj <= 9; jj++) { if (Map[x][jj] != '0') { if (Map[x][jj] == 'C') return true; else break; } } break; } } return false;}bool fei(int x, int y){ for (int i = x+1; i <= 10; i++) { if (Map[i][y] != '0') { if (Map[i][y] == 'G') return true; else return false; } } return false;}int main(){ int n,x,y,xx,yy; char ch; while (cin >> n >> x >> y) { if (n == 0 && x == 0 && y == 0) break; for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 9; j++) { Map[i][j] = '0'; } } // Map[x][y] = '*'; while (n--) { cin >> ch >> xx >> yy; // putchar(ch); // getchar(); Map[xx][yy] = ch; } bool ok1,ok2,ok3,ok4; bool flag = false;//被将 bool first_win = false; for (int i = x+1; i <= 10; i++) { if (Map[i][y] != '0') { if (Map[i][y] == 'G') { first_win = true; } break; } } if (first_win)//黑方根本不用走直接以飞将的方式获胜 { puts("NO"); continue; } if (x-1 >= 1) { xx = x - 1; yy = y; //马 ok1 = ma(xx,yy);//true代表会被将 //车 ok2 = che(xx,yy); //跑 ok3 = pao(xx,yy); //飞将 ok4 = fei(xx,yy); if (!ok1 && !ok2 && !ok3 && !ok4) { flag = true;//可以存活 } } if (x+1 <= 3) { xx = x + 1; yy = y; //马 ok1 = ma(xx,yy);//true代表会被将 //车 ok2 = che(xx,yy); //跑 ok3 = pao(xx,yy); //飞将 ok4 = fei(xx,yy); if (!ok1 && !ok2 && !ok3 && !ok4) { flag = true;//可以存活 } } if (y-1 >= 4) { xx = x; yy = y - 1; //马 ok1 = ma(xx,yy);//true代表会被将 //车 ok2 = che(xx,yy); //跑 ok3 = pao(xx,yy); //飞将 ok4 = fei(xx,yy); if (!ok1 && !ok2 && !ok3 && !ok4) { flag = true;//可以存活 } } if (y+1 <= 6) { xx = x; yy = y + 1; //马 ok1 = ma(xx,yy);//true代表会被将 //车 ok2 = che(xx,yy); //跑 ok3 = pao(xx,yy); //飞将 ok4 = fei(xx,yy); if (!ok1 && !ok2 && !ok3 && !ok4) { flag = true;//可以存活 } } if (!flag) puts("YES"); else puts("NO"); } return 0;}
0 0
- POJ4001/HDU4121 Xiangqi 大模拟
- BFS、模拟:UVa1589/POJ4001/hdu4121-Xiangqi
- 【HDU4121】Xiangqi模拟象棋checkmate
- UVa 1589Xiangqi(模拟 HDU4121)
- hdu4121 Xiangqi && uva1589 Xiangqi (模拟)
- POJ4001 Xiangqi
- poj4001 Xiangqi
- hdu4121/poj 4001 Xiangqi(模拟)
- hdu4121 xiangqi
- hdu4121 xiangqi
- hdu4121 Xiangqi
- HDU4121 UVa1589 Xiangqi 解题报告
- hdu 4121 Xiangqi 大模拟
- POJ4001-模拟象棋
- hdu4121 神模拟
- 2011 Asia Fuzhou Regional Contest-1001 hdu4121 Xiangqi
- poj4001
- 1589-Xiangqi【模拟】
- 二叉树查找
- AJAX进阶应用
- ubuntu设置环境变量
- NYOJ 290动物统计加强版(Trie树)
- Hash Tables 哈希表
- POJ4001/HDU4121 Xiangqi 大模拟
- Android 网络框架_网络框架的核心Http协议
- matlab 中画箭头
- MySQL日志管理
- Android 自定义View 圆环交替 等待效果
- Mongo使用命令
- python json.dumps 中文编码
- 非常详细的 Docker 学习笔记
- OpenGL应用开发---渲染管线