一:题目

在黑方只有一个“将”的情况下,红方只有(车、马、炮)(可以多个)、帅的情况下,判断黑方是否被将死

(一)题目详解

其中棋盘按照坐标方式表示,左上角为(,),列数最大9,行数最大10
G  表示  将帅
R  表示  车
H  表示  马
C  表示  炮

(二)样例输入

    //第一行第一个数字:表示红方有2个棋子  第二三个表示黑方“将”位置在(1,4)
G   //表示红方“帅”在(10,5) 
R   //表示红方“车”在(6,4)
  空行表示一次输入结束
5  //第一行第一个数字:表示红方有3个棋子 第二三个表示黑方“将”位置在(1,5)
H 5  //表示红方“马”在(4,5)
G 5  //表示红方“帅”在(10,5)
C 5  //表示红方“炮”在(7,5) 0  //全0表示结束

二:代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define N 7
int Num; //用于保存获取的个数
int xq[N][]; //棋盘数据

进行棋盘、坐标数据获取

int getData(int* r,int* c)
{
int n;
int i=; //进行数据获取
while ()
{
//获取数据起始位置
scanf("%d %d %d", &n, r, c); //n在(2,7)之间
Num = n;
if (n == )
return -; //全部结束 //获取数据,填充棋盘
while (n--)
{
getchar();
scanf("%c %d %d", (char*)&xq[i][], &xq[i][], &xq[i][]);
i++;
}
return ; //本次输入结束
}
}

判断中间是否有棋子,返回棋子个数

int judgeCaseInMid(int r1,int c1, int r2, int c2)
{
int j,min,max,count=;
min = max = ; if (r1 == r2) //判断行上是否同行中间有棋子
{
c1 > c2 ? min = c2, max = c1 : min = c1, max = c2;
for (j = ; j < Num; j++)
if (xq[j][] == r1 && (xq[j][]>min&&xq[j][] < max))
count++; //有中间棋子
}
if (c1 == c2) //判断列上是否同列中间有棋子
{
r1 > r2 ? min = r2, max = r1 : min = r1, max = r2;
for (j = ; j < Num; j++)
if (xq[j][] == c1 && (xq[j][]>min&&xq[j][] < max))
count++; //有中间棋子
} return count; //返回棋子个数
}

单独将马拿出来处理:因为马特殊

//判断马是否将死黑方    (r1,c1)为马,(r2,c2)为敌将
bool judgeCaseForHorse(int r1, int c1, int r2, int c2)
{
//利用勾股定理
int a, b;
a = r1 - r2;
b = c1 - c2; if (a*a + b*b == )
{
//考虑别马腿
if ((r1 - r2) == )
{
for (int i = ; i < Num; i++)
if (xq[i][] == r1 - && xq[i][] == c1)
return false;
} if ((r1 - r2) == -)
{
for (int i = ; i < Num; i++)
if (xq[i][] == r1 + && xq[i][] == c1)
return false;
} if ((c1 - c2) == )
{
for (int i = ; i < Num; i++)
if (xq[i][] == c1 - && xq[i][] == r1)
return false;
} if ((c1 - c2) == -)
{
for (int i = ; i < Num; i++)
if (xq[i][] == c1 + && xq[i][] == r1)
return false;
} return true;
} return false;
}

判断黑方将下一步是否可以走

//G是将 R是车 C是炮 H是马
int judgeCKByNextByte(int r, int c)
{
int i;
//遍历棋盘红方数据,判断是否将死这一步
for (i = ; i < Num;i++)
{
switch (xq[i][])
{
case 'G': //判断将
//判断黑方是否在同一列
if (xq[i][] == c)
if (!judgeCaseInMid(r, c, xq[i][], xq[i][]))
return ; //将死
break;
case 'R': //判断车
//车可以横向纵向走
//先判断是否在同一行或者同一列
if (xq[i][] == r || xq[i][] == c) //同行/列
//判断是否中间有棋子
if (!judgeCaseInMid(r, c, xq[i][], xq[i][]))
return ; //将死
break;
case 'C': //判断炮
if (xq[i][] == r || xq[i][] == c) //同行/列
//判断是否中间有棋子
if (==judgeCaseInMid(r, c, xq[i][], xq[i][]))
return ; //将死
break;
case 'H': //判断马
if (judgeCaseForHorse(xq[i][], xq[i][], r, c))
return ;
break;
}
}
return ;
}

判断是否将死黑方

bool judgeCK(int r, int c)
{
//判断将的运行空间(1,4)->(1,6)
// (2,4)->(2,6)
// (3,4)->(3,6) if (r >= && r < )//向下走
if (judgeCKByNextByte(r+, c) == )
return false; //未将死 if (r > && r <= )//向上走
if (judgeCKByNextByte(r - , c) == )
return false; //未将死 if (c >= && c < )//向右走
if (judgeCKByNextByte(r, c + ) == )
return false; //未将死 if (c > && c <= )//向左走
if (judgeCKByNextByte(r, c - ) == )
return false; //未将死 if ((r == && c == ) || (r == && c == ))//右下走
if (judgeCKByNextByte(r + , c + ) == )
return false; //未将死 if ((r == && c == ) || (r == && c == ))//左上走
if (judgeCKByNextByte(r - , c - ) == )
return false; //未将死 if ((r == && c == ) || (r == && c == ))//左下走
if (judgeCKByNextByte(r + , c - ) == )
return false; //未将死 if ((r == && c == ) || (r == && c == ))//右上走
if (judgeCKByNextByte(r - , c + ) == )
return false; //未将死 return true; //将死
}

主函数

int main()
{
int row, col; freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout); while ()
{
//进行数据输入
if (getData(&row, &col) == -)
return ;
//进行数据处理,判断是否将死
if (judgeCK(row, col))
printf("YES\n");
else
printf("NO\n");
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout); return ;
}

算法习题---4-1象棋(UVa1589)的更多相关文章

  1. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

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

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

  3. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  4. 算法习题---4-9数据挖掘(Uva1591)

    一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...

  5. tarjan算法 习题

    dfs树与tarjan算法 标签(空格分隔): 517coding problem solution dfs树 tarjan Task 1 给出一幅无向图\(G\),在其中给出一个dfs树\(T\), ...

  6. 【算法习题】正整数数组中和为sum的任意个数的组合数

    1.递归实现(参考:https://blog.csdn.net/hit_lk/article/details/53967627) public class Test { @org.junit.Test ...

  7. 算法习题-FFT

    Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...

  8. 算法习题---5-8图书管理系统*****<双向迭代器>(UVa230)

    一:题目 就是输入一系列书本名和作者名,然后输入命令模拟借书和还书,再输出归还的书的摆放位置.要求有两点: 需要对归还的书做特殊排序处理:作者名相同,则书本按书名从小到大排序:否则书本按作者名大小排序 ...

  9. 算法习题---5-7打印队列(UVa12100)

    一:题目 有一个打印机,有一些任务在排着队打印,每个任务都有优先级.打印时,每次取出队列第一个任务,如果它的优先级不是当前队列中最高的,就会被放到队尾,否则就打印出来.输出初始队列的第m个任务的打印时 ...

随机推荐

  1. Windows设置多用户同时远程登录

    1.在键盘上按Win+R键(也可以在开始菜单右键然后选择运行),在运行的输入框里面输入"gpedit.msc"命令.然后点击确定 ​ 2.在“计算机组策略”中依次展开 计算机配置- ...

  2. 投掷硬币(概率dp)

    小Hi有一枚神奇的硬币.已知第i次投掷这枚硬币时,正面向上的概率是Pi. 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少. Input 第一行包含两个整数N和M. 第二行包含N个实 ...

  3. 面向对象中特殊方法的补充、isinstance/issubclass/type、方法和函数、反射

    一.面向对象中特殊方法的补充 1.__str__ 能将对象名改成你想要的字符串,但是类型还是类 class Foo(object): def __init__(self): pass def func ...

  4. .NET Core 调试出现“应用程序处于中断模式”

    今天再看博客园的大神博客,按照例子写了一个文件读写的示例(对 .NET Core FileProvider 的应用). 在调试的时候出现了“应用程序处于中断模式”的问题,继续的话程序并没有向下执行,看 ...

  5. BZOJ1101 [POI2007]Zap 和 CF451E Devu and Flowers

    Zap FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到 ...

  6. docker学习(六) Docker命令查询

    Docker命令查询 1.基本语法docker [OPTIONS] COMMAND [arg...]一般来说,Docker 命令可以用来管理 daemon,或者通过 CLI 命令管理镜像和容器.可以通 ...

  7. 59、servlet3.0-异步请求

    59.servlet3.0-异步请求 59.1 开启servlet异步请求步骤 支持异步处理 asyncSupported=true 开启异步模式 req.startAsync(); 业务逻辑进行异步 ...

  8. ElementUI 之 Cascader 级联选择器指定 value label

    ElementUI 的 Cascader 级联选择器个人觉得很好用,但是对 :options="options" 里的数据格式是有特定要求的:input 框显示的值是 option ...

  9. 42 | grant之后要跟着flush privileges吗?

    在 MySQL 里面,grant 语句是用来给用户赋权的.不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效.我最开 ...

  10. simcom7600ce-t LBS function

    Welcome to minicom 2.7 OPTIONS: I18n Compiled on Nov 15 2018, 20:20:38.Port /dev/ttyUSB2, 00:55:23 P ...