HDU 4121 Xiangqi 我老了?
Xiangqi
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3193 Accepted Submission(s): 780
Now we introduce some basic rules of Xiangqi. Xiangqi is played on a 10×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”.
There is a blank line between two test cases. The input ends by 0 0 0.
G 10 5
R 6 4
3 1 5
H 4 5
G 10 5
C 7 5
0 0 0
NO

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 above.

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <map>
using namespace std;
int d[][]={{,},{-,},{,},{,-}};
struct Node{
int x;
int y;
char ch;
}node[];
char grid[][];
int n;
bool put[][];
bool cango(int x,int y){
if(x<||x>||y<||y>)
return ;
return ;
}
bool judge(int x,int y){
int i,j,xx,yy;
for(i=;i<=n;i++){
if(node[i].x==x&&node[i].y==y)
continue;
if(node[i].ch=='R'||node[i].ch=='G'){
for(j=;j<;j++){
xx=node[i].x+d[j][];
yy=node[i].y+d[j][];
while(cango(xx,yy)&&put[xx][yy]==){
if(xx==x&&yy==y)
return ;
xx+=d[j][];
yy+=d[j][];
}
}
}
else if(node[i].ch=='C'){
for(j=;j<;j++){
xx=node[i].x+d[j][];
yy=node[i].y+d[j][];
while(cango(xx,yy)&&put[xx][yy]==){
xx+=d[j][];
yy+=d[j][];
}
xx+=d[j][];
yy+=d[j][];
while(cango(xx,yy)&&put[xx][yy]==){
if(xx==x&&yy==y)
return ;
xx+=d[j][];
yy+=d[j][];
}
}
}
else if(node[i].ch=='H'){
int X=node[i].x ,h_x;
int Y=node[i].y ,h_y;
if(cango(X-,Y)&&put[X-][Y]==){
h_x=X-;
h_y=Y+;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
h_x=X-;
h_y=Y-;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
}
if(cango(X+,Y)&&put[X+][Y]==){
h_x=X+;
h_y=Y+;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
h_x=X+;
h_y=Y-;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
} if(cango(X,Y-)&&put[X][Y-]==){
h_x=X+;
h_y=Y-;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
h_x=X-;
h_y=Y-;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
} if(cango(X,Y+)&&put[X][Y+]==){
h_x=X+;
h_y=Y+;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
h_x=X-;
h_y=Y+;
if(cango(h_x,h_y)&&put[h_x][h_y]==){
if(h_x==x&&h_y==y)
return ;
}
}
}
}
return ;
}
int main(){
int ch,i,j,xx,yy,x,y,flag,sum,f;
while(scanf("%d%d%d",&n,&x,&y)){
if(n==&&x==&&y==)
break;
memset(put,,sizeof(put));
for(i=;i<=;i++)
for(j=;j<=;j++)
grid[i][j]='#';
for(i=;i<=n;i++){
cin>>node[i].ch>>node[i].x>>node[i].y;
put[node[i].x][node[i].y]=;
grid[node[i].x][node[i].y]=node[i].ch;
}
f=;
xx=x;
yy=y;
while(cango(xx,yy)){
xx+=;
if(grid[xx][yy]=='G'){
f=;
}
else if(grid[xx][yy]!='#')
break;
}
if(f){
printf("NO\n");
continue;
}
sum=flag=;
for(i=;i<;i++){
xx=x+d[i][];
yy=y+d[i][];
if(xx>=&&xx<=&&yy>=&&yy<=){
sum++;
put[xx][yy]=;
if(judge(xx,yy))
flag++;
if(grid[xx][yy]!='#')
put[xx][yy]=;
}
}
//printf("sum %d flag %d\n",sum,flag);
if(flag==sum)
printf("YES\n");
else
printf("NO\n");
}
return ;
}
13年

#include <iostream>
#include <string>
#include <string.h>
#include <map>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <set>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#pragma comment(linker, "/STACK:16777216")
using namespace std ;
typedef long long LL ;
struct Point{ /*坐标点*/
int X ;
int Y ;
Point(){} ;
Point(int x,int y):X(x),Y(y){} ;
}; struct Chess{ /*棋子数据*/
string S ;
Point P ;
Chess(){} ;
Chess(string s ,Point p):S(s),P(p){} ;
}; class Man{ /*玩家*/
private :
static int d_horse[][] ;
static int d_obstacle[][] ;
int N ;
int black_x ,black_y ;
bool grid[][] ;
vector<Chess> Genaral_Or_Che_Pao ; //将 or 车 or 炮
vector<Chess> Horse ; //马
public :
Man() ;
void read(vector<Chess> ,int ,int) ;
int cango(int,int) ;
int ok_genaral_or_che_pao() ;
int ok_horse() ;
int win() ; //是否必胜
}; int Man::d_horse[][]={{-,-},{-,},{-,},{,},
{,-},{,},{-,-},{,-} } ; int Man::d_obstacle[][]={{-,},{,},{,},{,-}}; Man::Man(){ } int Man::cango(int x ,int y){
return <= x && x<= && <= y && y <= ;
} void Man::read(vector<Chess> chess,int b_x ,int b_y){
black_x = b_x ;
black_y = b_y ;
memset(grid,,sizeof(grid)) ;
Genaral_Or_Che_Pao.clear() ;
grid[black_x][black_y] = ;
string s ;
int x ,y ;
for(int i = ;i < chess.size() ;i++){
s = chess[i].S ;
x = chess[i].P.X ;
y = chess[i].P.Y ;
if(x == black_x && y == black_y)
continue ;
grid[x][y] = ;
if(s == "H")
Horse.push_back(chess[i]) ;
else
Genaral_Or_Che_Pao.push_back(chess[i]) ;
}
} int Man::ok_genaral_or_che_pao(){
int x ,y ,L ,R ,k;
string s ;
for(int i = ;i < Genaral_Or_Che_Pao.size() ;i++){
x = Genaral_Or_Che_Pao[i].P.X ;
y = Genaral_Or_Che_Pao[i].P.Y ;
s = Genaral_Or_Che_Pao[i].S ;
if(x == black_x){
L = Min(y ,black_y) + ;
R = Max(y ,black_y) - ;
int dot = ;
for(k = L ;k <= R ;k++)
dot += grid[x][k] ;
if(dot == && s == "C")
return ;
if(dot == && s!= "C")
return ;
}
if(y == black_y){
L = Min(x ,black_x) + ;
R = Max(x ,black_x) - ;
int dot = ;
for(k = L ;k <= R ;k++)
dot += grid[k][y] ;
if(dot == && s == "C")
return ;
if(dot == && s!= "C")
return ;
}
}
return ;
} int Man::ok_horse(){
int x ,y ,k ,x2 ,y2 ,x1,y1;
for(int i = ;i < Horse.size() ;i++){
x = Horse[i].P.X ;
y = Horse[i].P.Y ;
for(k = ;k < ;k++){
x2 = d_horse[k][] + x ;
y2 = d_horse[k][] + y ;
x1 = d_obstacle[k>>][] + x ;
y1 = d_obstacle[k>>][] + y ;
if(!cango(x2,y2)||!cango(x1,y1))
continue ;
if(!grid[x1][y1] && black_x == x2 && black_y == y2)
return ;
}
}
return ;
} int Man::win(){
if(ok_genaral_or_che_pao())
return ;
if(ok_horse())
return ;
return ;
} class App{
private :
vector<Chess> chess ;
bool mat[][] ;
static int d[][] ;
int N ;
int black_x ;
int black_y ;
int red_x ;
int red_y ;
public :
App(){};
App(int ,int ,int) ;
int cango(int ,int) ;
int judge() ;
void read() ;
}; App::App(int n ,int x , int y):N(n),black_x(x),black_y(y){
chess.clear() ;
memset(mat,,sizeof(mat)) ;
}; int App::d[][]={{,},{-,},{,-},{,}} ; int App::cango(int x ,int y){
return <= x && x<= && <= y && y<= ;
} void App::read(){
chess.clear() ;
string s ;
int x ,y ;
for(int i = ;i <= N ;i++){
cin>>s>>x>>y ;
mat[x][y] = ;
chess.push_back(Chess(s,Point(x,y))) ;
if(s == "G"){
red_x = x ;
red_y = y ;
}
}
} int App::judge(){
if(black_y == red_y){ //黑方 将 直接 干死 红方 将
int dot = ;
for(int i = black_x + ;i <= red_x- ;i++)
dot += mat[i][red_y] ;
if(dot == )
return ;
}
int sum = ;
for(int i = ; i < ;i++){ //黑方 将 四个方向逃跑
int x = black_x + d[i][] ;
int y = black_y + d[i][] ;
if(!cango(x,y))
continue ;
Man red ;
red.read(chess,x,y) ; //传递数据,(x,y)为此时黑方的将
if(!red.win()) //只要红方不能赢 则不是 死局
return ;
}
return ;
} int main(){
int n ,x, y;
while(cin>>n>>x>>y){
if(n==&&x==&&y==)
break ;
App app(n,x,y) ;
app.read() ;
if(app.judge())
puts("NO") ;
else
puts("YES") ;
}
return ;
}
SR~046NDV.jpg)
HDU 4121 Xiangqi 我老了?的更多相关文章
- HDU 4121 Xiangqi 模拟题
Xiangqi Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4121 ...
- HDU 4121 Xiangqi (算是模拟吧)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4121 题意:中国象棋对决,黑棋只有一个将,红棋有一个帅和不定个车 马 炮冰给定位置,这时当黑棋走,问你黑 ...
- HDU 4121 Xiangqi --模拟
题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...
- HDU 4121 Xiangqi
模拟吧,算是... 被这个题wa到哭,真是什么都不想说了...上代码 #include <iostream> #include <cstring> using namespac ...
- HDU 4121
http://www.bnuoj.com/v3/problem_show.php?pid=10277 //#pragma comment(linker, "/STACK:16777216&q ...
- HDU 4461:The Power of Xiangqi(水题)
http://acm.hdu.edu.cn/showproblem.php?pid=4461 题意:每个棋子有一个权值,给出红方的棋子情况,黑方的棋子情况,问谁能赢. 思路:注意“ if a play ...
- HDU 4461 The Power of Xiangqi (水题)
题意:给定一些字母,每个字母都代表一值,如果字母中没有B,或者C,那么就在总值大于1的条件下删除1,然后比较大小. 析:没什么好说的,加起来比较就好了. 代码如下: #pragma comment(l ...
- *HDU 2108 计算几何
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 1010 深搜+剪枝
深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> ...
随机推荐
- SIlverlight外包公司【技术展望】— Silverlight5.1.2最新版本发布,Silverlight 的更新从未停止。
微软发布新版Silverlight 5, 版本号5.1.20913.0 大家可以到微软网站去下载最新版本网址是 http://www.microsoft.com/getsilverlight/get- ...
- Redis桌面管理工具 RedisDesktopManager
下载链接地址:[官网地址:https://redisdesktop.com] redis-desktop-manager-0.8.8.384.exe Source code (zip) Source ...
- CentOS下用pyenv 和 virtualenv 搭建单机多版本python 虚拟开发环境
安装 系统环境:CentOS 6.5 安装依赖 yum -y install gcc gcc-c++ make git patch openssl-devel zlib-devel readline- ...
- pgsql 9.4修改数据库只读
先进入psql 切换到目标数据库 \c mydb 对于老表 grant usage on schema public to $read_only_user; grant select on all t ...
- 一款灵活好用的日历控件Kalendae
Kalendae是一款纯js不依赖任何js库的日历控件,可以轻松实现显示月份数量,当前选中多个日期,并可以按照周等你想要的格式去定制选中项. 下载地址:GitHub/Kalendae 第一步:Kale ...
- cent os下面的基本配置操作
二,修改Linux分辨率命令行 在root用户模式下,输入$ vi /boot/grub/grub.conf(路径可能会不一样,也可以是 /etc/grub.conf),打开grub.conf文件 我 ...
- purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0
purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0 你在iOS6下使用3G网络时可能会遇到这条log,不用紧张,这只是苹果的工 ...
- 黄聪:TinyMCE 4 增强 添加样式、按钮、字体、下拉菜单和弹出式窗口
我最喜欢 WordPress 3.9 的更新是使用了 TinyMCE 4.0 编辑器.新的 TinyMCE 看起来看起来更整洁(真正匹配WP仪表板),它有一些非常不错的附加功能.我的很多老主题和插件必 ...
- javaweb工程,Servlet里面获取当前WEB跟路径的文件绝对路径地址
String base_Url = request.getSession().getServletContext().getRealPath("/"); String window ...
- Qt属性表控件的使用 QtTreePropertyBrowser
属性表是vs2003时引入的的新控件,用于流量和设置大量的信息,现在,很多软件上都能看到它的身影,如vs,Qt Creator等IDE的详细设置里都离不开属性表. 下图是Qt Creator里的属性表 ...