UVA1589 Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle between two armies with the goal of capturing the enemy's ``general" piece. In this problem, you are given a situation of later stage in the game. Besides, the red side has already ``delivered a check". Your work is to check whether the situation is ``checkmate".
Now we introduce some basic rules of Xiangqi. Xiangqi is played on a 10 x 9 board and the pieces are placed on the intersections (points). The top left point is (1,1) and the bottom right point is (10,9). There are two groups of pieces marked by black or red Chinese characters, belonging to the two players separately. During the game, each player in turn moves one piece from the point it occupies to another point. No two pieces can occupy the same point at the same time. A piece can be moved onto a point occupied by an enemy piece, in which case the enemy piece is``captured" and removed from the board. When the general is in danger of being captured by the enemy player on the enemy player's next move, the enemy player is said to have ``delivered a check". If the general's player can make no move to prevent the general's capture by next enemy move, the situation is called ``checkmate".

We only use 4 kinds of pieces introducing as follows:
- General: the generals can move and capture one point either vertically or horizontally and cannot leave the `` palace" unless the situation called `` flying general" (see the figure above). ``Flying general" means that one general can ``fly" across the board to capture the enemy general if they stand on the same line without intervening pieces.
- Chariot: the chariots can move and capture vertically and horizontally by any distance, but may not jump over intervening pieces
- Cannon: the cannons move like the chariots, horizontally and vertically, but capture by jumping exactly one piece (whether it is friendly or enemy) over to its target.
- Horse: the horses have 8 kinds of jumps to move and capture shown in the left figure. However, if there is any pieces lying on a point away from the horse horizontally or vertically it cannot move or capture in that direction (see the figure below), which is called `` hobbling the horse's leg".

Now you are given a situation only containing a black general, a red general and several red chariots, cannons and horses, and the red side has delivered a check. Now it turns to black side's move. Your job is to determine that whether this situation is ``checkmate".
Input
The input contains no more than 40 test cases. For each test case, the first line contains three integers representing the number of red pieces N ( 2N
7) and the position of the black general. The following N lines contain details of N red pieces. For each line, there are a char and two integers representing the type and position of the piece (type char `G' for general, `R' for chariot, `H' for horse and `C' for cannon). We guarantee that the situation is legal and the red side has delivered the check.
There is a blank line between two test cases. The input ends by `0 0 0'.
Output
For each test case, if the situation is checkmate, output a single word ` YES', otherwise output the word ` NO'.
Hint: In the first situation, the black general is checked by chariot and ``flying general''. In the second situation, the black general can move to (1, 4) or (1, 6) to stop check. See the figure below.

Sample Input
2 1 4
G 10 5
R 6 4 3 1 5
H 4 5
G 10 5
C 7 5 0 0 0
Sample Output
YES
NO
看到这么个问题确实有点头疼,但是仔细想过之后不难用模拟来解决问题,附上代码(略长);
#include<stdio.h>
#include<string.h>
struct L
{
int a,b;
};
struct L General;
struct L Chariot[];
struct L Horse[];
struct L Cannon[];
int Qipan[][];
int n,x,y;
int tempx,tempy;
char type[];
int i1,i2,i3;
int mainflag;
int checkGenerals(int,int);
int checkChariot(int,int,int,int);
int checkHorse(int,int,int,int);
int checkCannon(int,int,int,int);
int checkPoint(int,int);
int main()
{
while(scanf("%d%d%d",&n,&x,&y)==&&n)
//Pay attention to the point (x,y),which is the black general located.
{
memset(Qipan,,sizeof(Qipan));
//Create a Qipan and define all of it are 0.
Qipan[x][y]=;
// When put some point on the broad,transfer it into 1.
//input the date,and store it into struct General,Chariot,Horse,Cannon.
i1=i2=i3=;
for(int i=;i<n;i++)
{
scanf("%s%d%d",type,&tempx,&tempy);
Qipan[tempx][tempy]=;
if(type[]=='G')
{
General.a=tempx;
General.b=tempy;
}
else if(type[]=='R')
{
Chariot[i1].a=tempx;
Chariot[i1++].b=tempy;
}
else if(type[]=='H')
{
Horse[i2].a=tempx;
Horse[i2++].b=tempy;
}
else if(type[]=='C')
{
Cannon[i3].a=tempx;
Cannon[i3++].b=tempy;
}
}
// Now it's high time to deal with the problem,with all of the dates are stored in order.
// The first we must check whether the two generals face to face directly.
if(checkGenerals(x,y))
{
printf("NO\n");
continue;
}
mainflag=;
if(x+<)
{
Qipan[x][y]=;
Qipan[x+][y]++;
if(checkPoint(x+,y))
mainflag=;
Qipan[x][y]=;
Qipan[x+][y]--;
}
if(mainflag)
{
printf("NO\n");
continue;
}
if(x->)
{
Qipan[x][y]=;
Qipan[x-][y]++;
if(checkPoint(x-,y))
mainflag=;
Qipan[x][y]=;
Qipan[x-][y]--;
}
if(mainflag)
{
printf("NO\n");
continue;
}
if(y+<)
{
Qipan[x][y]=;
Qipan[x][y+]++;
if(checkPoint(x,y+))
mainflag=;
Qipan[x][y]=;
Qipan[x][y+]--;
}
if(mainflag)
{
printf("NO\n");
continue;
}
if(y->)
{
Qipan[x][y]=;
Qipan[x][y-]++;
if(checkPoint(x,y-))
mainflag=;
Qipan[x][y]=;
Qipan[x][y-]++;
}
if(mainflag)
{
printf("NO\n");
continue;
}
printf("YES\n");
}
}
int checkGenerals(int x,int y)
{
if(General.b==y)
{
int Flag=;
for(int i=x+;i<General.a;i++)
if(Qipan[i][y])
Flag++;
if(Flag==)
return ;
}
return ;
}
int checkChariot(int x1,int y1,int x2,int y2)
{
int Flag;
int xj1,yj1,xj2,yj2;
xj1=x1<x2?x1:x2;
xj2=x1>x2?x1:x2;
yj1=y1<y2?y1:y2;
yj2=y1>y2?y1:y2;
if(x1==x2&&y1==y2)
return ;
if(x1==x2)
{
Flag=;
for(int j=yj1+;j<yj2;j++)
if(Qipan[x1][j])
Flag=;
if(Flag==) return ;
}
if(y1==y2)
{
Flag=;
for(int i=xj1+;i<xj2;i++)
if(Qipan[i][y1])
Flag=;
if(Flag==) return ;
}
return ;
}
int checkHorse(int x1,int y1,int x2,int y2)
{
if(x1+==x2&&y1+==y2)
if(Qipan[x1][y1+]==)
return ;
if(x1+==x2&&y1-==y2)
if(Qipan[x1][y1-]==)
return ;
if(x1-==x2&&y1+==y2)
if(Qipan[x1][y1+]==)
return ;
if(x1-==x2&&y1-==y2)
if(Qipan[x1][y1-]==)
return ;
if(x1+==x2&&y1+==y2)
if(Qipan[x1+][y1]==)
return ;
if(x1+==x2&&y1-==y2)
if(Qipan[x1+][y1]==)
return ;
if(x1-==x2&&y1+==y2)
if(Qipan[x1-][y1]==)
return ;
if(x1-==x2&&y1-==y2)
if(Qipan[x1-][y1]==)
return ;
return ;
}
int checkCannon(int x1,int y1,int x2,int y2)
{
int Flag=;
int xj1,yj1,xj2,yj2;
xj1=x1<x2?x1:x2;
xj2=x1>x2?x1:x2;
yj1=y1<y2?y1:y2;
yj2=y1>y2?y1:y2;
if(x1==x2&&y1==y2) return ;
if(x1==x2)
{
for(int j=yj1+;j<yj2;j++)
if(Qipan[x1][j]) Flag++;
if(Flag==) return ;
}
if(y1==y2)
{
for(int i=xj1+;i<xj2;i++)
if(Qipan[i][y1]) Flag++;
if(Flag==) return ;
}
return ;
}
int checkPoint(int x,int y)
{
if(checkGenerals(x,y))
return ;
for(int i=;i<i1;i++)
if(checkChariot(Chariot[i].a,Chariot[i].b,x,y))
return ;
for(int i=;i<i2;i++)
if(checkHorse(Horse[i].a,Horse[i].b,x,y))
return ;
for(int i=;i<i3;i++)
{
if(checkCannon(Cannon[i].a,Cannon[i].b,x,y))
return ;
}
return ;
}
UVA1589 Xiangqi的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1589 #include<iostream> #incl ...
- UVA1589——xiangqi
开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以 ...
- 【习题4-1 Uva1589】Xiangqi
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ...
- HDU 4121 Xiangqi 我老了?
Xiangqi Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- Uva - 1589 - Xiangqi
Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...
- [算法竞赛入门经典] 象棋 ACM/ICPC Fuzhou 2011, UVa1589 较详细注释
Description: Xiangqi is one of the most popular two-player board games in China. The game represents ...
- Xiangqi(简单模拟)
4746: Xiangqi 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 15 测试通过:2 描述 Xiangqi i ...
- TZOJ 4746 Xiangqi(模拟棋盘数组)
描述 Xiangqi is one of the most popular two-player board games in China. The game represents a battle ...
随机推荐
- 关于MPLS协议几个容易忽略的点
1.随着硬件技术的进步,产生了高速路由器和三层交换机,MPLS提高转发的速度的初衷已经没有多少意义.但是MPLS由于其支持标签栈和面向连接的特点,使其在虚拟专用网,流量工程,QoS等方面得到广泛的应用 ...
- IOS 解析XML文档
前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...
- Configuring HTTP and HTTPS
Configuring HTTP and HTTPS .NET Framework (current version) Other Versions WCF services and clie ...
- android 让图片充满整个屏幕
方法1: <ImageView android:id="@+id/imageView1" android:layout_width="fill_parent&quo ...
- Linux CentOS 7 YouCompleteMe相关配置。
CentOS 6.5上面弄了2天,以失败告终!!!当作练手了.在网上看到一篇CentOS7.0上安装YouCompleteMe插件的文章,就重新在虚拟机上安装了一个CentOS7,按那个文章执行了一下 ...
- 介绍几个移动web app开发框架
jQuery Mobile jQuery Mobile框架能够帮助你快速开发出支持多种移动设备的Mobile应用用户界面.jQuery Mobile最新版本是1.4.0,默认主题采用扁平化设计风格.j ...
- 旋的X-Di
旋的X-Di | 氪加 旋的X-Di
- MongoDB命令行操作
本文专门介绍MongoDB的命令行操作.其实,这些操作在MongoDB官网提供的Quick Reference上都有,但是英文的,为了方便,这里将其稍微整理下,方便查阅. 这里用来做测试的是远端(10 ...
- MYSQL查询男女数量的存储过程
存储过程代码: BEGIN IF sex_id =0 THEN SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='女' INTO sex_co ...
- Android TextView中实现点击文本超链接(无下划线)的封装类
android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作.比如新浪微博上的一些keyword,点击时会跳转到对应的页面. 怎样实现我们就直接看源代码吧. /** * ...