传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4121

题意:中国象棋对决,黑棋只有一个将,红棋有一个帅和不定个车 马 炮冰给定位置,这时当黑棋走,问你黑棋是不是被将死了(当前位置被将,能走得下一步也被将)

题解:代码里面注释很详细,我就不多说了,知道象棋规则的同学基本上都可以做出来

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
using namespace std; #define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s) scanf("%s",s)
#define pi1(a) printf("%d\n",a)
#define pi2(a,b) printf("%d %d\n",a,b)
#define mset(a,b) memset(a,b,sizeof(a))
#define forb(i,a,b) for(int i=a;i<b;i++)
#define ford(i,a,b) for(int i=a;i<=b;i++) typedef long long LL;
const int N=110001;
const int M=1000007;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-7; char mp[11][11];
int bx,by,n;
int tt[4][2]={1,0,-1,0,0,1,0,-1}; struct node
{
int x,y;
}pp[11]; bool shu(int x1,int x2,int y)
{
if(x1>x2) swap(x1,x2);
int f=0;
for(int i=x1+1;i<x2;i++)
if(mp[i][y]!='0')
f=1;
if(f) return false;
else return true;
} bool heng(int x,int y1,int y2)
{
if(y1>y2) swap(y1,y2);
int f=0;
for(int j=y1+1;j<y2;j++)
if(mp[x][j]!='0')
f=1;
if(f) return false;
else return true;
} bool shuone(int x1,int x2,int y)
{
if(x1>x2) swap(x1,x2);
int f=0;
for(int i=x1+1;i<x2;i++)
if(mp[i][y]!='0')
f++;
if(f!=1) return false;
else return true;
} bool hengone(int x,int y1,int y2)
{
if(y1>y2) swap(y1,y2);
int f=0;
for(int j=y1+1;j<y2;j++)
if(mp[x][j]!='0')
f++;
if(f!=1) return false;
else return true;
} bool jiang(int x,int y)
{
forb(i,0,n)
{
int rx=pp[i].x,ry=pp[i].y;
char c=mp[rx][ry];
if(c=='G')//对将的时候,判断在一列且中间没有棋子
{
if(ry==y&&shu(x,rx,y)) return true;
}
if(c=='R')//车,判断在一行一列且中间没有棋子
{
if(x==rx&&heng(x,y,ry)) return true;
if(y==ry&&shu(x,rx,y)) return true;
}
if(c=='H')//马,判断距离为3,且没有被撇马腿
{
if((abs(x-rx)+abs(y-ry))!=3) continue;
if(abs(x-rx)==2)
{
if(rx<x&&mp[rx+1][ry]=='0') return true;
if(rx>x&&mp[rx-1][ry]=='0') return true;
}
if(abs(y-ry)==2)
{
if(ry<y&&mp[rx][ry+1]=='0') return true;
if(ry>y&&mp[rx][ry-1]=='0') return true;
}
}
if(c=='C')//炮,判断在一行一列且中间只有一个棋子
{
if(x==rx&&hengone(x,y,ry)) return true;
if(y==ry&&shuone(x,rx,y)) return true;
}
}
return false;
} int main()
{
while(scanf("%d%d%d",&n,&bx,&by)&&(n+bx+by)!=0)
{
memset(mp,'0',sizeof(mp));
char c;
int x,y;
forb(i,0,n)
{
cin>>c>>x>>y;
mp[x][y]=c;
pp[i].x=x; pp[i].y=y;
} if(!jiang(bx,by))//如果开始的时候都不将军则直接输出no
{
printf("NO\n");
continue;
}
int flag=0;
forb(i,0,4)//可以向四个方向走
{
x=bx+tt[i][0];
y=by+tt[i][1];
if(x>=1&&x<=3&&y>=4&&y<=6)//注意范围
{
char c=mp[x][y];//这个地方要注意,如果有棋子的话可以吃,开始的时候我认为有棋子的地方不能走
mp[x][y]='0';
if(!jiang(x,y))//判断能不能将军
{
flag=1;
break;
}
mp[x][y]=c;//还原
}
}
printf("%s\n",flag?"NO":"YES");
}
return 0;
}

HDU 4121 Xiangqi (算是模拟吧)的更多相关文章

  1. HDU 4121 Xiangqi 模拟题

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

  2. HDU 4121 Xiangqi --模拟

    题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...

  3. HDU 4121 Xiangqi

    模拟吧,算是... 被这个题wa到哭,真是什么都不想说了...上代码 #include <iostream> #include <cstring> using namespac ...

  4. HDU 4121 Xiangqi 我老了?

    Xiangqi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. HDU 5510---Bazinga(指针模拟)

    题目链接 http://acm.hdu.edu.cn/search.php?action=listproblem Problem Description Ladies and gentlemen, p ...

  6. HDU 5047 Sawtooth(大数模拟)上海赛区网赛1006

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 解题报告:问一个“M”型可以把一个矩形的平面最多分割成多少块. 输入是有n个“M",现 ...

  7. HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))

    扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  8. HDU 5935 Car 【模拟】 (2016年中国大学生程序设计竞赛(杭州))

    Car Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. HDU 5912 Fraction 【模拟】 (2016中国大学生程序设计竞赛(长春))

    Fraction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

随机推荐

  1. dataset导出成excel

    之前网上查找了很多关于这类的代码.要不是中文乱码,要不是就是太复杂.这个是我用过最好用的. //ds为数据源,filename为保存的文件名 publicvoidCreateExcel(DataSet ...

  2. Code First 数据注释--DatabaseGenerated

    EF中可以使用DatabaseGenerated设置数据库字段的属性,它有三个枚举值:Computed.None.Identity Computed 表示这一列是计算所得 None 不做处理 Iden ...

  3. Csharp 高级编程 C7.1.2

    第七章 代理(1) 一.代理要声明 二.代理使用步骤 声明代理 初始化代理(使用 实例的方法名 作为参数) 使用代理 代码示例: /*C7.1.2*/ using System; using Syst ...

  4. iOS_SN_深浅拷贝( 百度的)_转载

    文章原地址:http://www.cnblogs.com/5ishare/p/4362459.html 深浅拷贝前提是:是实现NSCopying或者NSMutableCopying协议. 浅拷贝只是复 ...

  5. c#串口编程和单片机通信重大发现

    1.遇到问题时看看这里 //每次响应中断结束后清空缓存,防止在显示关闭时,打开后又一次性出现 serialPort1.DiscardInBuffer();

  6. Hadoop1.2.1伪分布模式安装指南

    一.前置条件 1.操作系统准备 (1)Linux可以用作开发平台及产品平台. (2)win32只可用作开发平台,且需要cygwin的支持. 2.安装jdk 1.6或以上 3.安装ssh,并配置免密码登 ...

  7. 高效的jQuery代码编写技巧总结

    最近写了很多的js,虽然效果都实现了,但是总感觉自己写的js在性能上还能有很大的提升.本文我计划总结一些网上找的和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度 ...

  8. Android studio快捷键Mac版本

    为了方便大家记住这些小技巧和快捷键,我把它写成了一个插件,欢迎大家下载使用:http://chunsheng.me/EasyShortcut/ 快捷键 描述 通用------------------- ...

  9. canvas-js贝塞尔曲代码在线生成工具

    canvas贝塞尔曲代码在线生成工具 可以快速生成二次.三次贝塞尔曲线的源码生成器,方便经常使用到canvas画图的同学使用,可以直接预览效果随意画出自己想要的图像. 生成源码效果预览: canvas ...

  10. windows安装配置mysql-5.7.13-winx64方法

    1.mysql-5.7.13-winx64.zip下载 官方下载地址:http://dev.mysql.com/downloads/mysql/ 2.解压到D:\mysql\mysql-5.7.13- ...