●赘述题意

给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”。当前为黑方的回合,问黑方的“将”能否在移动一步后不被“将军”。

●题解

本题就是一个模拟:枚举“将”向四个方向走,是否满足题意。

但比较考察逻辑和代码能力。

但有一个坑点:

“将”在移动时,不能移动到与“帅”照面。

但,恶心的数据会有输入的局面就出现将帅照面的情况,按理说,应是黑方赢了(因为轮到黑方的回合),也就是说在程序中加一个特判。但不需要这么做,或者说:不需要我们这样处理,黑“将”不能在这种情况下直接向“帅”“开大炮”…

●代码(没用网上的二维数组的方法,是直接枚举红棋判断)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int mv[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
const int hv[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
const int hp[8][2]={{-1,0},{0,1},{0,1},{1,0},{1,0},{0,-1},{0,-1},{-1,0}};
struct node{
char ch;
int x,y;
}a[10];
int n;
int abs(int x)
{
return x>0?x:-x;
}
bool eat(int bx,int by,int p)
{
return bx==a[p].x&&by==a[p].y;
}
bool CRkill(int bx,int by,int p,int t)
{
if(a[p].x!=bx&&a[p].y!=by) return 0;
int fg=a[p].y==by,l,r,cnt=0;
if(!fg) l=min(a[p].y,by),r=max(a[p].y,by);
else l=min(a[p].x,bx),r=max(a[p].x,bx);
for(int i=1;i<=n;i++) if(i!=p&&!eat(bx,by,i))
{
if(!fg&&a[i].x==bx&&l<a[i].y&&a[i].y<r) cnt++;
if(fg&&a[i].y==by&&l<a[i].x&&a[i].x<r) cnt++;
}
return cnt==t;
}
bool Hkill(int bx,int by,int p)
{
if(abs(bx-a[p].x)*abs(by-a[p].y)!=2) return 0;
int fx,fy;
for(int i=0;i<8;i++)
{
fx=a[p].x+hv[i][0];
fy=a[p].y+hv[i][1];
if(fx==bx&&fy==by)
{
bool fg=1;
for(int j=1;j<=n;j++) if(j!=p&&!eat(bx,by,j))
if(a[j].x==a[p].x+hp[i][0]&&a[j].y==a[p].y+hp[i][1]) fg=0;
if(fg) return 1;
}
}
return 0;
}
bool live(int bx,int by)
{
for(int i=1;i<=n;i++) if(!eat(bx,by,i))
{
if(a[i].ch=='G'&&CRkill(bx,by,i,0)) return 0;
if(a[i].ch=='R'&&CRkill(bx,by,i,0)) return 0;
if(a[i].ch=='C'&&CRkill(bx,by,i,1)) return 0;
if(a[i].ch=='H'&&Hkill(bx,by,i)) return 0;
}
return 1;
}
bool check(int bx,int by)
{
int fx,fy;
for(int i=0;i<4;i++)
{
fx=bx+mv[i][0];
fy=by+mv[i][1];
if(fx<1||fx>3||fy<4||fy>6) continue;
if(live(fx,fy)) return 0;
}
return 1;
}
int main()
{
int bx,by;
while(1)
{
cin>>n>>bx>>by;
if(!n&&!bx&&!by) break;
for(int i=1;i<=n;i++)
cin>>a[i].ch>>a[i].x>>a[i].y;
if(check(bx,by)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}

●UVa 1589 Xiangqi(模拟)的更多相关文章

  1. UVA 1589:Xiangqi (模拟 Grade D)

    题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> # ...

  2. 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天

    题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...

  3. Uva - 1589 - Xiangqi

    Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...

  4. 【UVA】1589 Xiangqi(挖坑待填)

    题目 题目     分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的 ...

  5. HDU 4121 Xiangqi 模拟题

    Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...

  6. UVA 246 - 10-20-30 (模拟+STL)

    UVA 246 - 10-20-30 题目链接 题意:给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,假设有牌堆形成了下面3种情况(按顺序推断): 1.头两张+尾一张和为10或20 ...

  7. TZOJ 4746 Xiangqi(模拟棋盘数组)

    描述 Xiangqi is one of the most popular two-player board games in China. The game represents a battle ...

  8. UVa 11988 (数组模拟链表) Broken Keyboard (a.k.a. Beiju Text)

    题意: 模拟一个文本编辑器,可以输入字母数字下划线,如果遇到'['则认为是Home键,如果是']'则认作End键. 问最终屏幕上显示的结果是什么字符串. 分析: 如果在数组用大量的移动字符必然很耗时. ...

  9. uva 1589 by sixleaves

    坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...

随机推荐

  1. 每日冲刺报告——Day5(Java-Team)

    第五天报告(11.6  周一) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...

  2. scrapy 数据存储mysql

    #spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ru ...

  3. 使用XIB的UITableViewCell自适应,以及出现的问题进行解决

    1.首先需要定义一个属性 @property (nonatomic, strong) UITableViewCell *prototypeCell; 2.在创建完tableView后加上如下代码 se ...

  4. Vim 中文社区:期待你的加入

    我们的愿景 Vim 中文社区一直比较零散,缺少凝聚力,现有的一些群经常也是水的可以的,讨论各种无关紧要的内容,于是导致很大一部分人,将这些群丢入了群助手,渐渐地他们也淡出了 vim 中文社区. 而我理 ...

  5. python-map的用法

    map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 1.当seq只 ...

  6. ArrayList、Vector、LinkedList、HashMap、HashTable的存储性能和特性

    ArrayList和Vector都是使用数组方式存储数据,次数组元素大于实际存储的数据以便添加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数 ...

  7. WPF 自定义RadioButton样式

    一.RadioButton基本样式 RadioButton基本样式包含两种状态,这里也是使用两张图片来代替两种状态,当然你也可以通过IconFont或Path来替换这两种状态. 效果如下: 样式代码如 ...

  8. ELK学习总结(2-3)Mget获取多个文档

     mget 获取多个文档 1.curl 命令格式:mget获取多个文档: curl  'localhost:9200/_mget'  -d  '{ "docs":[ { " ...

  9. django的models模块查询方法

    假定models中有一个类BookInfo 模块查询不同于sql语句,模块查询的结果会返回符合条件的整个一行的对象,或者多个对象组成的查询集. 查询集类似列表,有相似的方法. 1 model查询语句: ...

  10. 在Android项目中使用Java8

    前言 在过去的文章中我介绍过Java8的一些新特性,包括: Java8新特性第1章(Lambda表达式) Java8新特性第2章(接口默认方法) Java8新特性第3章(Stream API) 之前由 ...