●赘述题意

给出一个中国象棋残局,告诉各个棋子的位置,黑方只有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. 关于Mac OS 使用GIT的引导

    1. 下载Git installer 链接地址:https://ncu.dl.sourceforge.net/project/git-osx-installer/git-2.14.1-intel-un ...

  2. 关于安装wordpress出现500 Internal Server Error的解决方案

    安装新版本wordpress出现500 Internal Server Error的问题: 在./wp-includes/class-http.php的268行,改成 $request_order = ...

  3. Twisted 延迟调用

    延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制 1.基本使用 defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函 ...

  4. [知识梳理]课本1&2.1-2.5

    面向对象的语言 出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系. 特点: 是高级语言. 将客观事物看作具有属性和行为的对象. 通过抽象找出同一类对象的共同属性和行为,形成类. 通过 ...

  5. io文本加密

    文本加密习题 package io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu ...

  6. POJ1236【Tarjan+缩点】

    题目大意:有向关系体现在电脑可以通过网络单向的传输文件,并规定一旦有电脑存在该文件,那么所有它能传输的电脑就能在第一时间得到这个文件,题目有两个问题,第一个是最少向网络中的几台电脑投放文件,能使得整个 ...

  7. Python_fullstack_test1

    1.执行Python脚本的两种方式 使用交互式的带提示符的解释器或使用源文件 2.简述位.字节的关系 位是计算机中最小计量单位,用bit表示 字节是计算机中最小存储单位,用Byte表示 1字节=8位, ...

  8. sumo快速运行简单仿真实例详细教程

    本文旨在让大家快速的了解sumo,并给出运行一个简单的sumo的例子的教程,进而了解基本sumo工程的架构,使大家对该软件产生兴趣并持续学习下去,刚开始学习仿真的确枯燥,项目"跑起来&quo ...

  9. jsonViewer json格式化工具

    以前一直以来都觉得xml个可读性要比json的可读性好,后来使用了JSON Viewer这个小工具之后,发现自己错了.之前认为json的可读性差,完全是因为没有很好的查看工具.JSON Viewer这 ...

  10. java基本数据类型的包装类

    基本类型对应的包装类 byte(Byte).short(Short).int(Integer).long(Long).float(Float).double(Double).char(Characte ...