nyoj 1034 将军问题

本文介绍了一种算法,用于判断中国象棋中是否存在一方被将军的局面。通过分析棋子的走法规则,实现了计算机自动识别将军状态的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将军问题

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描述

关于中国象棋,想必大家都很熟悉吧。我们知道,在走棋的时候,被对方將军的这种情形是很容易被人察觉的(不然,你也太粗心了)。但是我们的计算机是如何识别这种情形的呢?它显然没有人的这种“直觉”。这就是我们今天要解决的问题,你的任务就是写一段计算机代码,根据当前局面信息,判断是否存在一方正在被另一方將军的情形,并给出正确结果。

./1.png

图片一

如图一,象棋棋盘由九条竖线和十条横线交叉组成。棋盘上共有九十个交叉点,象棋子就摆放在和活动在这些交叉点上。棋盘中间没有画通直线的地方,叫做“九宫”。棋子共有三十二个,分为红、黑两组,每组共十六个,各分七种,其名称和数目如下:

  • 红棋子: 帅一个,车、马、炮、相、仕各两个,兵五个。

  • 黑棋子: 将一个,车、马、炮、象、士各两个,卒五个。

各种棋子的走法如下:

  • 将(帅)每一步只许前进、后退、横走,但不能走出“九宫”。

  • 士(仕)每一步只许沿“九宫”斜线走一格,可进可退。

  • 象(相)不能越过“河界”,每一步斜走两格,可进可退,即俗称“象(相)走田字“。当田字中心有别的棋子时,俗称”塞象(相)眼“,则不许走过去。

  • 马每步一直(或一横)一斜,可进可退,即俗称”马走日字“。如果在要去的方向有别的棋子挡住,俗称”蹩马腿”,则不许走过去。具体可参考图二。

./2.png

图片二

  • 车每一步可以直进、直退、横走,不限步数。

  • 炮在不吃子的时候,走法跟车一样。在吃子时必须隔一个棋子(无论是哪一方的)跳吃,即俗称“炮打隔子”。

  • 卒(兵)在没有过“河界”前,没步只许向前直走一格;过“河界”后,每步可向前直走或横走一格,但不能后退。

另外,在一个局面中,如果一方棋子能够走到的位置有对方将(帅)的存在,那么该局面就称为將军局面,我们的任务就是找出这样的局面。根据上述规则,我们很容易就能推断出只有以下几种方式才会造成將军局面:

  1. 将(帅)照面。即将和帅在同一直线上。

  2. 马对将(帅)的攻击。(注意马有蹩脚)

  3. 车对将(帅)的攻击。

  4. 炮对将(帅)的攻击。(注意炮要隔一子)

  5. 过河兵对将(帅)的攻击。

输入
输入的第一行为一个正整数n(1<=n<=100)。表示有n个测试局面。
接下来的n次测试,每次输入10行,每行输入9个特定正整数,用来表示一个局面(上黑下红)。其中数字0表示该处无棋子,其他数字具体表示如下:
黑方:将(1)、士(2,3)、象(4,5)、马(6,7)、车(8,9)、炮(10,11)、卒(12,13,14,15,16)
红方:帅(17)、仕(18,19)、相(20,21)、马(22,23)、车(24,25)、炮(26,27)、兵(28,29,30,31,32)
提示:样例中的第一组数据表示的是初始局面,第二组数据表示的是图一的局面。
输出
如果存在将军局面,则输出"yes"。反之,输出"no"。
样例输入
2
8 6 4 2 1 3 5 7 9
0 0 0 0 0 0 0 0 0
0 10 0 0 0 0 0 11 0
12 0 13 0 14 0 15 0 16
0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0
28 0 29 0 30 0 31 0 32
0 26 0 0 0 0 0 27 0
0 0 0 0 0 0 0 0 0 
24 22 20 18 17 19 21 23 25

8 6 4 2 1 3 5 0 9
0 0 0 0 0 0 0 0 0
0 10 0 0 0 0 7 11 0
12 0 13 0 14 0 15 0 16
0 0 0 0 0 0 0 0 0 
0 0 0 0 27 0 0 0 0
28 0 29 0 30 0 31 0 32
0 26 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 
24 22 20 18 17 19 21 23 25
样例输出

no

yes

 

#include <stdio.h>
#include <string.h>
int rx,ry,bx,by;
int map[12][12];
int ma()
{
    for(int i=22;i<=23;i++){
        if(map[bx-1][by-1]==0){
            if(map[bx-2][by-1]==i||map[bx-1][by-2]==i)
                return 1;
        }
        if(map[bx-1][by+1]==0){
            if(map[bx-2][by+1]==i||map[bx-1][by+2]==i)
                return 1;
        }
        if(map[bx+1][by-1]==0){
            if(map[bx+1][by-2]==i||map[bx+2][by-1]==i)
                return 1;
        }
        if(map[bx+1][by+1]==0){
            if(map[bx+1][by+2]==i||map[bx+2][by+1]==i)
                return 1;
        }
    }
    for(int i=6;i<=7;i++){
         if(map[rx-1][ry-1]==0){
            if(map[rx-2][ry-1]==i||map[rx-1][ry-2]==i)
                return 1;
        }
        if(map[rx-1][ry+1]==0){
            if(map[rx-2][ry+1]==i||map[rx-1][ry+2]==i)
                return 1;
        }
        if(map[rx+1][ry-1]==0){
            if(map[rx+1][ry-2]==i||map[rx+2][ry-1]==i)
                return 1;
        }
        if(map[rx+1][ry+1]==0){
            if(map[rx+1][ry+2]==i||map[rx+2][ry+1]==i){
                return 1;
            }
        }
    }
    return 0;
}
int zu()
{
    for(int i = 28;i <= 32;i++)
        if(map[bx+1][by]==i||map[bx][by+1]==i||map[bx][by-1]==i)
            return 1;
    for(int i = 12 ; i <= 16 ;i++)
        if(map[rx-1][ry]==i||map[rx][ry+1]==i||map[rx][ry-1]==i)
            return 1;
    return 0;
}
int ju(int x,int y)
{
    int j,star,end;
    if(map[x][y]==1)
    {
        star=24,end = 25;
    }
    else if(map[x][y]==17)
    {
        star = 8,end = 9;
    }
    for(int i = 1 ; i <= 9 ;i++)
    {
        if(map[x][i]==star||map[x][i]==end){
            if( i < y){
                int count  = 0 ;
                for( j = i+1 ; j < y ; j++)
                    if(map[x][j]!=0)
                        count ++;
                    if(count == 0) return 1 ;
            }
            else if( i > y)
            {
                int count =  0;
                for(j = y+1 ; j < i ; j++)
                if(map[x][j]!=0)
                    count ++ ;
                if(count == 0)
                 return 1 ;
            }
        }
    }
    for(int i = 1 ; i <= 10 ; i++)
    {
        if(map[i][y]==star||map[i][y]==end)
        {
            if(i < x)
            {
                int count  =  0;
                for(j = i+1 ; j < x ; j++)
                if(map[j][y]!=0)
                   count ++;
                if(0 == count){
                return 1 ;}
            }
            if(i > x)
            {
                int count = 0 ;
                for(j = x+1 ; j < i ; j++)
                  if(map[j][y]!=0)
                   count ++ ;
                if(count == 0){
//                    printf("!!\n");
                return 1 ;}
            }
        }
    }
    return 0;
}
int pao(int x,int y)
{
    int j,star,end;
    if(map[x][y]==1)
    {
        star=26,end = 27;
    }
    else if(map[x][y]==17)
    {
        star = 10,end = 11;
    }
    for(int i = 1 ; i <= 9 ;i++)
    {
        if(map[x][i]==star||map[x][i]==end){
            if( i < y){
                int count = 0;
                for( j = i + 1; j < y ; j++)
                    if(map[x][j]!=0)
                       count++;
                if(count==1){
                    return 1;
                }
            }
            else if( i > y)
            {
                int count = 0;
                for(j = y+1 ; j < i ; j++)
                if(map[x][j]!=0)
                    count++;
                if(count==1)
                    return 1;
            }
        }
    }
    for(int i = 1 ; i <= 10 ; i++)
    {
        if(map[i][y]==star||map[i][y]==end)
        {
            if(i < x)
            {
                int count = 0 ;
                for(j = i+1 ; j < x ; j++)
                if(map[j][y]!=0)
                    count++;
                if(count==1)
                    return 1;
            }
            if(i > x)
            {
                int count =  0;
                for(j = x+1 ; j < i ; j++)
                 if(map[j][y]!=0)
                    count++;
                 if(count==1)
                    return 1;
            }
        }
    }
    return 0;
}
int jun(int x,int  y)
{
    int n=x,m=y;
    while(n++)
    {
        if(map[n][m]==17)
            return 1;
        if(map[n][m]!=0)
            return 0;
    }
    return 0;
}
int main(void)
{
	int n;
	scanf("%d",&n);
	while(n--){
	    memset(map,-1,sizeof(map));
	    for(int i = 1 ; i <= 10 ; i++)
	    for(int j = 1 ; j <= 9  ; j++){
            scanf("%d",&map[i][j]);
            if(map[i][j]==1){
                bx=i;by=j;
            }
            if(map[i][j]==17){
                rx=i;ry = j;
            }
	    }
	    int f2=ma();if(f2){printf("yes\n");continue;}
	    int f3=zu();if(f3){printf("yes\n");continue;}
	    int f5=ju(rx,ry);if(f5){printf("yes\n");continue;}
	    int f6=ju(bx,by);if(f6){printf("yes\n");continue;}
	    int f7=pao(rx,ry);if(f7){printf("yes\n");continue;}
	    int f8=pao(bx,by);if(f8){printf("yes\n");continue;}
	    int f9=jun(bx,by);if(f9){printf("yes\n");continue;}
        printf("no\n");
	}
	return 0;
}


 

 

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值