●赘述题意

给出一个中国象棋残局,告诉各个棋子的位置,黑方只有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. Beta敏捷冲刺每日报告——Day1

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.2 00:00 -- 2017.11.3 00:00 讨论时间地点 2017.11.2 晚9:30,电话会议会议 ...

  2. 关于from nltk.book import * 报错解决方法

    import nltk nltk.download() 在使用上面命令安装了nltk库并运行下载后,再输入from nltk.book import * 往往会出现这样的错误提示: 出现这种错误往往是 ...

  3. APP案例分析--扇贝单词

    APP案例分析 一.调研 1.第一次上手   第一次使用时,一进APP,有一个每日一句,然后就是登录界面.有点不舒服,我都还不知道你这个APP好不好用,不让我体验一下就要注册.简单的测试了我的英语水平 ...

  4. eclipse maven项目目录

    今天遇见一个错误,关于eclipse项目的路径问题,web-inf的路径,上图和下图出现了两种web-INF,src的web-INFf和webContent的web-INF,src里面的文件需要编译以 ...

  5. mosquitto安装和测试

    一.安装 1.windows安装 安装完毕,更新安装目录的dll文件 2.linux安装 编译保存用户数据到数据库的插件 安装 3.启动 mosquitto mosquitto mosquitto_p ...

  6. Docker的容器操作

    启动一次性运行的容器 入门级例子:从ubuntu:14.04镜像启动一个容器,成功后在容器内部执行/bin/echo 'hello world'命令,如果当前物理机没有该镜像,则执行docker pu ...

  7. python 爬取百度翻译进行中英互译

    感谢RoyFans 他的博客地址http://www.cnblogs.com/royfans/p/7417914.html import requests def py(): url = 'http: ...

  8. JavaScript中Global、Math、Date对象的常用方法

    JavaScript当中Global.Math.Date类型常用方法如下: /* js 中 Global对象 是一个不存在的对象,它里面的方法可以调用 常用方法: 1 encodeURI 对uri进行 ...

  9. intelj idea 创建聚合项目(典型web项目,包括子项目util、dao、service)

    需求:第三方提供了http api接口,我们需要将其数据全部取回来,存放到本地Mysql数据库. 开发工具是intelj idea,准备基于maven创建聚合项目,util作为工具包,单独作为一个工程 ...

  10. Spring Data Jpa简单了解

    原文来源:http://www.cnblogs.com/xuyuanjia/p/5707681.html 以下是自己简单整理原有文章,其实就是在原来文章基础上化重点以及可能会有所删减的方式进行整理,需 ...