开始碰到这个题时觉得太麻烦了直接跳过没做,现在放假了再次看这个题发现没有想象中那么麻烦,主要是题目理解要透彻,基本思路就是用结构体数组存下红方棋子,让黑将军每次移动一下,看移动后是否有一个红方棋子可以吃掉它,这样做黑将军吃子这一情况就可以完美的跳过了,因为只看不在黑将军移动后位置的棋子是否能吃掉他。二维数组模拟棋盘,注意皇宫,玩过象棋的应该对规则比较熟悉,注意憋马脚的情况,不懂得可以看看中国象棋的规则。下面附上我的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. 使用xadmin覆盖Django的admin

    安装xadmin pip 安装 pip install xadmin  可能会报错 pip install git+git://github.com/sshwsfc/xadmin.git 安装后要使用 ...

  2. STM32空闲中断

    收发共存的思路没有经过验证!!! 空闲中断:既可以用来作为不定长接收数据帧的断帧判断/特别是DMA数据的接收,也可以用来指示中断发送的结束. 在需要发送的地方USART_ITConfig(UART5, ...

  3. setTimout( , 0) 详解

    setTimout( , 0) 一.前言 前端工程师们工作久了,一般都会在某些地方看见过这样的代码: setTimeout(function(){ // TODO }, 0); 举个实例,移动端我们经 ...

  4. SQL概念及DDL语句

    SQL概念 SQL全称(Structured Query Language):结构化查询语句,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询和管理关系型数据库. 其实就 ...

  5. PHPStorm2017.1.3永久激活方法之本地破解激活

    是时候升级你的phpstorm了,咱们马上行动! 下载 1.phpstorm https://www.jetbrains.com/phpstorm/download/ 2.破解包 破解补丁无需使用注册 ...

  6. 解决ueditor jquery javascript 取值问题

    代码如下: var content = UE.getEditor('myEditor').getContent();   myEditor是ueditor 的名称name.   代码如下: <t ...

  7. bt5r3开启远程登录

    sshd-generate /etc/init.d/ssh restart

  8. HDU 2089 不要62 (数位DP,入门)

    题意: 只要含连续的62,或者含4的车牌号码都是不吉利的,其他都是吉利的组合.问区间[L,R]中有多少个数是吉利的? 思路: 依然是利用树(10进制是十叉树)的思想,统计左边所有子树有多少个数是吉利的 ...

  9. UVA439 knightMoves (A*启发搜索)

    第一个A*,纪念下. A*要保证最短路一定要估价函数小于等于实际值,越接近越好 估价函数取Manhattan距离除以二. //Rey #include<cstdio> #include&l ...

  10. 文本框复制代码,兼容大部分浏览器(ZeroClipboard插件、附件)

    ;;list-style-type:none;} a,img{;} body{font:12px/180% Arial, Helvetica, sans-serif ,"新宋体"; ...