●赘述题意

给出一个中国象棋残局,告诉各个棋子的位置,黑方只有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. B-dya6

    1.昨天的困难,今天解决的进度,以及明天要做的事情 昨天的困难:在导入导出方面遇到了困难,导出的文件不能直接导入. 今天解决的进度:完成了登录页面的背景设计,并再次测试了整个系统的功能. 明天要做的事 ...

  2. Bate敏捷冲刺每日报告--day2

    1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285)  Git链接:https://github.com/WHUSE2017/C-team 2 ...

  3. Alpha冲刺第一天

    Alpha冲刺第一天 站立式会议 项目进展 项目的第一天,主要工作是对项目的开发进行规划,以及将规划的成果转化为燃尽图与博客文章.依据项目需求分析报告与开题报告中已经完成的设计任务和项目规划,我们将系 ...

  4. 团队作业7——第二次项目冲刺(Beta版本12.04)

    1.当天站立式会议照片 本次会议内容:1:每个人汇报自己完成的工作.2:组长分配各自要完成的任务. 2.每个人的工作 黄进勇:项目整合,后台代码. 李勇:前台界面优化. 何忠鹏:数据库模块. 郑希彬: ...

  5. 第四十四条:为所有导出的API元素编写文档注释

    简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...

  6. JAVA_SE基础——71.Random类制作随机验证码

    public class Demo5 { public static void main(String[] args) { char[] arr={'s','b','g','h','a','c'}; ...

  7. django报错Manager isn't accessible via UserInfo instances

    出现这种错误是因为调用模型对象时使用了变量名,而不是对象名(模型类),例如: user = UserInfo()user_li = user.objects.filter(uname=username ...

  8. oracle导入命令,记录一下

    工作中用到了,这个命令,记录一下,前提要安装imp.exe imp PECARD_HN/PECARD_HN@127.0.0.1:1521/orcl file=E:\work\dmp\PECARD_HN ...

  9. Linq 生成运算符 Empty,Range,Repeat

    var c1 = Enumerable.Empty<string>();//c1.Count=0 , );//{9527,9528,9529,......9536} , );//{9527 ...

  10. windbg查找Kernel32.dll基址

    一.首先准备好一个程序,运行起来,用windbg进行附加调试,由于每个windows下的程序都会加载kernel32.dll,因此,找基址的过程是一样的:  二.查看PEB地址: 法一.r $peb ...