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

    .net中,其字符串特有的驻留机制,保证了在同一进程中,相同字符序列的字符串,只有一个实例,这样能避免相同内容的字符串重复实例化,以减少性能开销. 先来回顾一下c#中的代码: public stati ...

  2. 转:error LNK2005: ...already defined in MSVCRTD.lib

    编译错误: Error1error LNK2005: _CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR110D.dll)\libcmtd.l ...

  3. SQL server的一个分割表值函数

    CREATE FUNCTION [dbo].[Fn_Split] ( @SplitString text, -- 如果要传入NText类型,下面需要相应的修改,注释行为NText下同 ) = ','- ...

  4. js操作文档对象的节点

    好吧,为了能让大家不至于睡着,我们先回顾先前面的东东吧~ 1.首先我们写了javaScriput的是一门弱类型的解释性的脚本语言:弱类型:我们的变量不用申明其具体的数据类型,在使用的时候浏览器根据其存 ...

  5. 51nod 1191 消灭兔子

    题目来源: 2013腾讯马拉松赛第三场 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N只兔子,每只有一个血量B[i],需要用箭杀死免子.有M种不同类型的箭可以 ...

  6. python爬虫之路——正则表达式初识

    正则表达式:是一个特殊的符号系列,检查字符串是否与指定模式匹配. python中的re模块拥有全部的正则表达式功能. 判断字符: 类型: 数目:有无:   个数:单值     区间      离散 判 ...

  7. Linux中根据访问日志统计访问量最高的前N个IP

    前段时间面试中被问到如上问题,日常不怎么注意积累,以此谨记. 访问IP 页面[nxuser@im440-zh test]$ vi log 135.252.172.181 page1 136.252.1 ...

  8. UVA 110020 Efficient Solutions (STL)

    把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点. 那么所有有优势的点将会形成一条下凹的曲线. 因为可能有重点,用multise ...

  9. Android(java)学习笔记135:SQLite数据库(表)的创建 以及 SQLite数据库的升级

    一.数据库的创建 1.文件的创建      //引用,如果文件不存在是不会创建的   File  file = new File("haha.txt"):     //输出流写数据 ...

  10. jquery Syntax error, unrecognized expression:的解决方法

    原文地址 https://blog.csdn.net/flowingfog/article/details/42739773 问题: 将模板的html内容转换成jquery时报以下错误:Syntax ...