题意:

给出一个黑方的将, 然后 红方有 2 ~ 7 个棋子, 给出摆放位置,问是否已经把黑将将死, 红方已经将军。

分析:

分情况处理, 车 马 炮, 红将情况跟车是一样的。

建一个数组board保存棋局, 然后建一个数组moveable用来算出黑将当前位置能走的格子(1可走, 0不可走, 一开始都是1), 判断一下黑将上下左右四个方位是否能走, 而且走了之后算一下当前位置moveable是否0即可。

代码:

 #include <bits/stdc++.h>
using namespace std;
int N, bx, by;
int board[][];
int tboard[][];
int movable[][];
struct CHESS
{
char name;
int x, y;
}chess[];
void Chariot(int x, int y){
for(int i = x - ; i >= ; i--){
movable[i][y] = ;
if(tboard[i][y] && tboard[i][y] != 'B')
break;
}
for(int i = x + ; i <= ; i++){
movable[i][y] = ;
if(tboard[i][y] && tboard[i][y] != 'B')
break;
}
for(int i = y + ; i <= ; i++){
movable[x][i] = ;
if(tboard[x][i] && tboard[x][i] != 'B')
break;
}
for(int i = y - ; i >= ; i --){
movable[x][i] = ;
if(tboard[x][i] && tboard[x][i] != 'B')
break;
}
}
void Cannon(int x, int y)
{
for(int i = x - ; i >= ; i --){
if(tboard[i][y] && tboard[i][y] != 'B'){
for(int j = i - ; j >= ; j--){
movable[j][y] = ;
if(tboard[j][y] && tboard[j][y] != 'B')
break;
}
break;
}
}
for(int i = x + ; i <= ; i++){
if(tboard[i][y] && tboard[i][y] != 'B'){
for(int j = i+; j <= ; j++){
movable[j][y] = ;
if(tboard[j][y] && tboard[j][y] != 'B')
break;
}
break;
}
}
for(int i = y - ; i >= ; i--){
if(tboard[x][i] && tboard[x][i] != 'B'){
for(int j = i - ; j >= ; j--){
movable[x][j] = ;
if(tboard[x][j] && tboard[j][y] != 'B')
break;
}
break;
}
} for(int i = y + ; i <= ; i++){
if(tboard[x][i] && tboard[x][i] != 'B'){
for(int j = i + ; j <= ; j++){
movable[x][j] = ;
if(tboard[x][j] && tboard[j][y] != 'B')
break;
}
break;
}
} }
int dir[][] = {{-,},{,},{,},{,-}};//上右下左
int dir2[][] = {{-,-},{-,},{-,},{,},{,},{,-},{,-},{-,-}};
void Horse(int x, int y)
{
for(int i = ; i < ; i++){
int tx = x, ty = y;
tx += dir[i][];
ty += dir[i][];
if(tx >= && ty >= && tx <= && ty <= );
else continue;
if(tboard[tx][ty]) continue;
tx = x; ty = y;
tx += dir2[(i+)* - ][];
ty += dir2[(i+)* - ][];
if(tx >= && ty >= && tx <= && ty <= )
movable[tx][ty] = ;
tx = x; ty = y;
tx += dir2[(i+)* - ][];
ty += dir2[(i+)* - ][];
if(tx >= && ty >= && tx <= && ty <= )
movable[tx][ty] = ;
}
}
int main()
{ while(scanf("%d %d %d", &N, &bx, &by) != EOF){
if(N == ) break;
memset(board, , sizeof(board));
board[bx][by] = 'B';
for(int i = ; i <= ; i++){
for(int j = ; j<= ; j++){
movable[i][j] = ;
}
} for(int i = ; i < N; i++){
int x, y;
char name;
scanf(" %c", &name);
scanf("%d %d", &x, &y);
board[x][y] = name;
}
int ok = ;
for(int i = ; i < ; i++)
{
int tx = bx, ty = by;
tx += dir[i][];
ty += dir[i][];
if(tx >= && tx <= && ty >= && ty <= );
else continue;
for(int k = ; k <= ; k++){
for(int j = ; j <= ; j++){
tboard[k][j] = board[k][j];
}
}
tboard[tx][ty] = 'B'; for(int k = ; k <= ; k++){
for(int j = ; j<= ; j++){
movable[k][j] = ;
}
} for(int k = ; k <= ; k++){
for(int j = ; j <= ; j++){
switch(tboard[k][j]){
case 'G':
Chariot(k,j);
break;
case 'R':
Chariot(k,j);
break;
case 'H':
Horse(k,j);
break;
case 'C':
Cannon(k,j);
break;
}
}
} if(movable[tx][ty])
ok = ;
}
printf("%s\n", ok ? "NO":"YES"); }
return ;
}

UVA 1589 象棋的更多相关文章

  1. ●UVa 1589 Xiangqi(模拟)

    ●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...

  2. 【每日一题】 UVA - 1589 Xiangqi 函数+模拟 wa了两天

    题意:背景就是象棋, 题解:坑点1(wa的第一天):将军可以吃掉相邻的棋子,(然行列也写反了orz) 坑点2(wa的第二天):将军到马要反过来写,边界有误,并且第一次碰到的车才算(写到后来都忘了) # ...

  3. UVA 1589:Xiangqi (模拟 Grade D)

    题目: 象棋,黑棋只有将,红棋有帅车马炮.问是否死将. 思路: 对方将四个方向走一步,看看会不会被吃. 代码: 很难看……WA了很多发,还越界等等. #include <cstdio> # ...

  4. uva 1589 by sixleaves

    坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...

  5. Uva - 1589 - Xiangqi

    Xiangqi is one of the most popular two-player board games in China. The game represents a battle bet ...

  6. UVa 11538 象棋中的皇后

    https://vjudge.net/problem/UVA-11538 题意: n×m的棋盘,有多少种方法放置两个相互攻击的皇后? 思路: 这两个皇后互相攻击的方式只有3种,在同一行,在同一列,或在 ...

  7. dir命令只显示文件名

    dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...

  8. 【UVA】1589 Xiangqi(挖坑待填)

    题目 题目     分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的 ...

  9. UVA 439 Knight Moves(BFS)

    Knight Moves option=com_onlinejudge&Itemid=8&category=11&page=show_problem&problem=3 ...

随机推荐

  1. nginx静态资源服务器简单配置

    有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/a ...

  2. 解决Robot Framework运行时没有Log的方案

    Robot Framework自动化测试过程中,运行多次后会出现RIDE没有log的情况. 造成这种现象的原因是: 执行失败的测试用例,chrome.exe和chromedriver.exe进程没有关 ...

  3. [CTSC2000]丘比特的烦恼

    Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...

  4. MyEclipse配置Tomcat

    1.在Window->Perferences->MyEclipse->Servers->Tomcat->Tomcat 7.x中启用Tomcat并配置Tomcat路径和JD ...

  5. DB2:在缓冲池 "1" 中当前没有任何页面可用。. SQLCODE=-1218, SQLSTATE=57011, DRIVER=3.61.75

    服务器端DB2数据库最近频繁报错: 在缓冲池 , SQLSTATE=, DRIVER= 试验发现简单的查询SQL执行没有问题,复杂的SQL就会报上述错误. 百度发现是因为数据库bufferpool太小 ...

  6. fix for 12c profile

    .for CDBS run as sysDBa CREATE OR REPLACE FUNCTION verify_function (username varchar2, password varc ...

  7. Spark学习之在集群上运行Spark(6)

    Spark学习之在集群上运行Spark(6) 1. Spark的一个优点在于可以通过增加机器数量并使用集群模式运行,来扩展程序的计算能力. 2. Spark既能适用于专用集群,也可以适用于共享的云计算 ...

  8. Node.js——开放静态资源原生写法

    借助了mime第三方包,根据请求地址请求的文件后缀,设置content-type

  9. 【ARM开发板】迅为IMX6开发板QT下LVDS和HDMI双屏异显

    本文转自迅为论坛:http://www.topeetboard.com 平台:迅为-IMX6开发板 首先开发板分别连接9.7寸屏和HDMI显示器,然后使用MfgTool工具烧写QT系统,然后拨码开关设 ...

  10. cal - 显示一个日历

    总览 cal [-mjy ] [月份 [年份 ] ] 描述 Cal 显示一个简单的日历.. 如果没有指定参数, 则显示当前月份. 选项如下所列: -m 显示星期一作为一周的第一天.. (缺省为星期日. ...