1. 程式人生 > >NBUT[1002]: 將軍問題

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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			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\n");
			flags=1;
			continue;
		}
		
		if(flags==1)
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;	
}