zoukankan      html  css  js  c++  java
  • NBUT[1002]: 将军问题

    https://ac.2333.moe/Problem/view.xhtml?id=1002

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

      ./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>
    #define N 20
    int a[N][N];
    int main()
    {
    	int t,i,j,m,n,flag,sum,flags;
    	scanf("%d",&t);
    	while(t--)
    	{
    		flags=0;
    		for(i=1;i<=10;i++)
    			for(j=1;j<=9;j++)
    				scanf("%d",&a[i][j]);
    			
    		flag=0;
    		for(i=1;i<=3;i++)
    		{
    			for(j=4;j<=6;j++)
    			{
    				if(a[i][j]==1)
    				{
    					flag=1;
    					break;
    				}
    			}
    			if(flag==1)
    				break;
    		}
    		n=i;m=j;
    		if(a[n][m-1]==28||a[n][m-1]==29||a[n][m-1]==30||a[n][m-1]==31||a[n][m-1]==32)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if(a[n][m+1]==28||a[n][m+1]==29||a[n][m+1]==30||a[n][m+1]==31||a[n][m+1]==32)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if(a[n+1][m]==28||a[n+1][m]==29||a[n+1][m]==30||a[n+1][m]==31||a[n+1][m]==32)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		sum=0;                     
    		for(i=m-1;i>=1;i--)
    		{
    			if(a[n][i]==0)
    				continue;
    			else if( (a[n][i]==24||a[n][i]==25) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[n][i]==26||a[n][i]==27) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}
    		sum=0;                     
    		for(i=m+1;i<=9;i++)
    		{
    			if(a[n][i]==0)
    				continue;
    			else if( (a[n][i]==24||a[n][i]==25) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[n][i]==26||a[n][i]==27) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}
    		sum=0;
    		for(i=n+1;i<=10;i++)      
    		{
    			if(a[i][m]==0)
    				continue;
    			else if( (a[i][m]==24||a[i][m]==25) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[i][m]==26||a[i][m]==27) && sum==1)
    			{
    				flags=1;
    				
    				continue;
    			}
    			else if(a[i][m]==17 && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}	
    		sum=0;
    		for(i=n-1;i>=1;i--)       
    		{
    			if(a[i][m]==0)
    				continue;
    			else if( (a[i][m]==24||a[i][m]==25) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[i][m]==26||a[i][m]==27) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}	
    		if((n+2<=10&&m+1<=9) && (a[n+2][m+1]==22||a[n+2][m+1]==23) && a[n+1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+1<=10&&m+2<=9) && (a[n+1][m+2]==22||a[n+1][m+2]==23) && a[n+1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-1>=1&&m+2<=9) && (a[n-1][m+2]==22||a[n-1][m+2]==23) && a[n-1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-2>=1&&m+1<=9) && (a[n-2][m+1]==22||a[n-2][m+1]==23) && a[n-1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-2>=1&&m-1>=1) && (a[n-2][m-1]==22||a[n-2][m-1]==23) && a[n-1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-1>=1&&m-2>=1) && (a[n-1][m-2]==22||a[n-1][m-2]==23) && a[n-1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+1<=10&&m-2>=1) && (a[n+1][m-2]==22||a[n+1][m-2]==23) && a[n+1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+2<=10&&m-1>=1) && (a[n+2][m-1]==22||a[n+2][m-1]==23) && a[n+1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		flag=0;
    		for(i=8;i<=10;i++)
    		{
    			for(j=4;j<=6;j++)
    			{
    				if(a[i][j]==17)
    				{
    					flag=1;
    					break;
    				}
    			}
    			if(flag==1)
    				break;
    		}
    		n=i;m=j;
    		if(a[n][m-1]==12||a[n][m-1]==13||a[n][m-1]==14||a[n][m-1]==15||a[n][m-1]==16)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if(a[n][m+1]==12||a[n][m+1]==13||a[n][m+1]==14||a[n][m+1]==15||a[n][m+1]==16)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if(a[n-1][m]==12||a[n-1][m]==13||a[n-1][m]==14||a[n-1][m]==15||a[n-1][m]==16)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}	
    		
    		sum=0;                     
    		for(i=m-1;i>=1;i--)
    		{
    			if(a[n][i]==0)
    				continue;
    			else if( (a[n][i]==8||a[n][i]==9) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[n][i]==10||a[n][i]==11) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}
    		sum=0;                     
    		for(i=m+1;i<=9;i++)
    		{
    			if(a[n][i]==0)
    				continue;
    			else if( (a[n][i]==8||a[n][i]==9) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[n][i]==10||a[n][i]==11) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}
    		sum=0;
    		for(i=n+1;i<=10;i++)      
    		{
    			if(a[i][m]==0)
    				continue;
    			else if( (a[i][m]==8||a[i][m]==9) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[i][m]==10||a[i][m]==11) && sum==1)
    			{
    				flags=1;
    				
    				continue;
    			}
    			else if(a[i][m]==1 && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}	
    		sum=0;
    		for(i=n-1;i>=1;i--)      
    		{
    			if(a[i][m]==0)
    				continue;
    			else if( (a[i][m]==8||a[i][m]==9) && sum==0)
    			{
    				flags=1;
    				continue;
    			}
    			else if((a[i][m]==10||a[i][m]==11) && sum==1)
    			{
    				flags=1;
    				continue;
    			}
    			else sum++;
    		}	
    		if((n+2<=10&&m+1<=9) && (a[n+2][m+1]==6||a[n+2][m+1]==7) && a[n+1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+1<=10&&m+2<=9) && (a[n+1][m+2]==6||a[n+1][m+2]==7) && a[n+1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-1>=1&&m+2<=9) && (a[n-1][m+2]==6||a[n-1][m+2]==7) && a[n-1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-2>=1&&m+1<=9) && (a[n-2][m+1]==6||a[n-2][m+1]==7) && a[n-1][m+1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-2>=1&&m-1>=1) && (a[n-2][m-1]==6||a[n-2][m-1]==7) && a[n-1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n-1>=1&&m-2>=1) && (a[n-1][m-2]==6||a[n-1][m-2]==7) && a[n-1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+1<=10&&m-2>=1) && (a[n+1][m-2]==6||a[n+1][m-2]==7) && a[n+1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		if((n+2<=10&&m-1>=1) && (a[n+2][m-1]==6||a[n+2][m-1]==7) && a[n+1][m-1]==0)
    		{
    			printf("yes
    ");
    			flags=1;
    			continue;
    		}
    		
    		if(flags==1)
    			printf("yes
    ");
    		else
    			printf("no
    ");
    	}
    	return 0;	
    } 
  • 相关阅读:
    Java Servlet API中文说明文档
    JavaWeb学习总结(一)——JavaWeb开发入门
    Android ListView滑动底部自动加载更多
    Android TextView 手动上下滑动
    Android抽象布局——include、merge 、ViewStub
    Android 信鸽推送通知栏不显示推送的通知
    Twitter License for Android
    Uber License for Android
    Android Studio之build.gradle小技巧
    Android动画之硬件加速
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10056595.html
Copyright © 2011-2022 走看看