开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以吃掉它,这样做黑将军吃子这一情况就可以完美的跳过了,因为只看不在黑将军移动后位置的棋子是否能吃掉他。二维数组模拟棋盘,注意皇宫,玩过象棋的应该对规则比较熟悉,注意憋马脚的情况,不懂得可以看看中国象棋的规则。下面附上我的AC代码,主要是输入那块很烦,只是用getchar()读掉一个回车的话本地测试是对的,交上去却会出现问题,只好用字符串读,然后取首字母。

AC代码:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h> struct qi{
char name;
int x, y;
}hei, qizi[];
int qipan[][], n;
int judge();
int deal(int a, int b);
int H(int, int, int, int);
int C(int, int, int, int);
int R(int, int, int, int);
int main()
{
char s[];
while(scanf("%d %d %d", &n, &hei.x, &hei.y) == && n && hei.x && hei.y)
{
memset(qipan,,sizeof(qipan));
int i;
for(i = ; i < n; i++)
{
scanf("%s %d %d", s, &qizi[i].x, &qizi[i].y);
qizi[i].name = s[];
qipan[qizi[i].x][qizi[i].y] = qizi[i].name;
}
printf("%s\n", judge() ? "YES" : "NO");
}
return ;
} int judge()
{
int i;
for(i = hei.x; i <= ; i++)
{
if(qipan[i][hei.y] != )
{
if(qipan[i][hei.y] == 'G') return ;
else break;
}
}
if(hei.x > && deal(hei.x - , hei.y)) return ;
else if(hei.x < && deal(hei.x + , hei.y)) return ;
else if(hei.y > && deal(hei.x, hei.y - )) return ;
else if(hei.y < && deal(hei.x, hei.y + )) return ;
return ;
} int deal(int a, int b)
{
int i;
for(i = ; i < n; i++)
{
if(qizi[i].x == a && qizi[i].y == b)
continue;
if(qizi[i].name == 'R' || qizi[i].name == 'G')
{
if(R(qizi[i].x, qizi[i].y, a, b))
return ;
}
else if(qizi[i].name == 'C')
{
if(C(qizi[i].x, qizi[i].y, a, b))
return ;
}
else if(qizi[i].name == 'H')
{
if(H(qizi[i].x, qizi[i].y, a, b))
return ;
}
}
return ;
} int H(int x, int y, int a, int b)
{
if(qipan[x + ][y] == && x + == a && (y - == b || y + == b))
return ;
if(qipan[x - ][y] == && x - == a && (y - == b || y + == b))
return ;
if(qipan[x][y + ] == && y + == b && (x - == a || x + == a))
return ;
if(qipan[x][y - ] == && y - == b && (x - == a || x + == a))
return ;
return ;
} int C(int x, int y, int a, int b)
{
int i;
if(x == a)
{
int min = y > b ? b : y;
int max = y > b ? y : b;
int num = ;
for(i = min + ; i < max; i++)
if(qipan[x][i])
num++;
if(num == )
return ;
return ;
}
if(y == b)
{
int min = x > a ? a : x;
int max = x > a ? x : a;
int num = ;
for(i = min + ; i < max; i++)
if(qipan[i][y])
num++;
if(num == )
return ;
return ;
}
return ;
} int R(int x, int y, int a, int b)
{
int i;
if(x == a)
{
int min = y > b ? b : y;
int max = y > b ? y : b;
for(i = min + ; i < max; i++)
if(qipan[x][i] != )
return ;
return ;
}
if(y == b)
{
int min = x > a ? a : x;
int max = x > a ? x : a;
for(i = min + ; i < max; i++)
if(qipan[i][y] != )
return ;
return ;
}
return ;
}

UVA1589——xiangqi的更多相关文章

  1. UVA1589 Xiangqi

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

  2. [刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1589 #include<iostream> #incl ...

  3. 【习题4-1 Uva1589】Xiangqi

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ...

  4. HDU 4121 Xiangqi 我老了?

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

  5. HDU 4121 Xiangqi 模拟题

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

  6. Uva - 1589 - Xiangqi

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

  7. [算法竞赛入门经典] 象棋 ACM/ICPC Fuzhou 2011, UVa1589 较详细注释

    Description: Xiangqi is one of the most popular two-player board games in China. The game represents ...

  8. Xiangqi(简单模拟)

    4746: Xiangqi 时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte 总提交: 15            测试通过:2 描述 Xiangqi i ...

  9. TZOJ 4746 Xiangqi(模拟棋盘数组)

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

随机推荐

  1. Bootcamp Win10蓝牙鼠标的问题

    运行services.msc找到Bluetooth support service 把启动类型从手动改为自动 重新连接蓝牙鼠标

  2. springboot使用过滤器和拦截器

    1.Filter过滤器 @Componentpublic class AuthFilter implements Filter { private static final Log log = Log ...

  3. ribbon重试机制

    我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问. 下面的例子 ...

  4. mongodb的投影

    mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段. find() 方法 MongoDB 的find()方法, ...

  5. PHP超全局变量、魔术变量和魔术方法

    PHP超全局变量 $_GET 通过get方式传递的值(通过 URL 参数传递给当前脚本的变量的数组.) $_POST 通过post形式传递的值(当 HTTP POST 请求的 Content-Type ...

  6. ios 开发发布证书配置详细流程

    iOS证书配置实践 本文参考了: iOS证书配置指南:http://dev.umeng.com/push/ios/license-configuration-guide 写在前面: 团队开发证书的管理 ...

  7. pytest+allure2+jenkins环境部署

    1.pycharm安装allure-pytest 2.jenkins -> 系统管理 -> 插件管理 -> 可选插件中过滤Allure,勾选对应插件安装 如下图:  3.安装完插件后 ...

  8. selenium+python之自动换测试用例执行

    1.一个用例为一个完整的场景,从用户登陆系统到最终退出并关闭浏览器. 2.一个用例只验证一个功能点,不要试图在用户登陆系统后把所有的功能都验证一遍. 3.尽可能少的编写逆向逻辑用例.一方面因为逆向逻辑 ...

  9. 小技巧:unicode RLO

    unicode 控制字符 RLO 可以将位于其后的文字翻转. 于是可以被病毒利用. 如图 重命名文件,在gpj前插入unicode RLO,之后若不小心,可能会被欺骗,误以为是jpg文件. 如果修改程 ...

  10. HTML之基本语法(段落标签、标题标签、空格标签、换行标签、图片标签和图片的基本属性)

    一.HTML标签 所谓的HTML的标签就是发明者认为定义好的一些单词,就相当于我们汉语中的字 二.HTML的语法 语法就是用来定义这些“字”应该如何解析或者书写的规则 三.常见标签及基本语法 1.人为 ...