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 ( 2
N
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 ...
随机推荐
- IIC 概述之3
为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理.对于时序不理解的朋友请参考“I2C总线之(二)---时序” 完整的程序如下: ...
- android 巧用finish方法
在android应用开发中,我们从一个activity跳到另一个activity时,我么要用到Intent: eg:Intent intent = new Intent(A.this,B.class) ...
- CCI_chapter 19 Moderate
19 1 Write a function to swap a number in place without temporary variables void swap(int &a, i ...
- 如何做Gibbs采样(how to do gibbs-sampling)
原文地址:<如何做Gibbs采样(how to do gibbs-sampling)> 随机模拟 随机模拟(或者统计模拟)方法最早有数学家乌拉姆提出,又称做蒙特卡洛方法.蒙特卡洛是一个著名 ...
- JavaScript Function 函数深入总结
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下 ...
- c语言指针与结构体之内存动态分配
struct dangdangtest { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }; void main2() { //struct dan ...
- html5标签收集
<meta name="viewport" content="width=device-width,initial-scale=1 user-scalable=0& ...
- 关于ionic的一些坑(2)
如果你通过查阅相关文档,ionic的项目框架已经搭好,下面我来总结一下我在项目中所遇到的坑,给还没踩过的人以方便,给自己以勉励: (1)关于android和ios的适配 因为ionic默认的tabs状 ...
- 基础总结篇之中的一个:Activity生命周期
子曰:溫故而知新,能够為師矣.<論語> 学习技术也一样,对于技术文档或者经典的技术书籍来说,指望看一遍就全然掌握,那基本不大可能,所以我们须要常常回过头再细致研读几遍,以领悟到作者的思想精 ...
- axis WebServices 完美调用天气预报,查询、显示 代码!
axis WebServices 完美调用天气预报,查询.显示 代码! 效果: jsp页面: <%@ page language="java" import="ja ...