NBUT[1002]: 將軍問題
https://ac.2333.moe/Problem/view.xhtml?id=1002
- 問題描述
-
關於中國象棋,想必大家都很熟悉吧。我們知道,在走棋的時候,被對方將軍的這種情形是很容易被人察覺的(不然,你也太粗心了)。但是我們的計算機是如何識別這種情形的呢?它顯然沒有人的這種“直覺”。這就是我們今天要解決的問題,你的任務就是寫一段計算機程式碼,根據當前局面資訊,判斷是否存在一方正在被另一方將軍的情形,並給出正確結果。
圖片一
如圖一,象棋棋盤由九條豎線和十條橫線交叉組成。棋盤上共有九十個交叉點,象棋子就擺放在和活動在這些交叉點上。棋盤中間沒有畫通直線的地方,叫做“九宮”。棋子共有三十二個,分為紅、黑兩組,每組共十六個,各分七種,其名稱和數目如下:
-
紅棋子: 帥一個,車、馬、炮、相、仕各兩個,兵五個。
-
黑棋子: 將一個,車、馬、炮、象、士各兩個,卒五個。
各種棋子的走法如下:
-
將(帥)每一步只許前進、後退、橫走,但不能走出“九宮”。
-
士(仕)每一步只許沿“九宮”斜線走一格,可進可退。
-
象(相)不能越過“河界”,每一步斜走兩格,可進可退,即俗稱“象(相)走田字“。當田字中心有別的棋子時,俗稱”塞象(相)眼“,則不許走過去。
-
馬每步一直(或一橫)一斜,可進可退,即俗稱”馬走日字“。如果在要去的方向有別的棋子擋住,俗稱”蹩馬腿”,則不許走過去。具體可參考圖二。
圖片二
-
車每一步可以直進、直退、橫走,不限步數。
-
炮在不吃子的時候,走法跟車一樣。在吃子時必須隔一個棋子(無論是哪一方的)跳吃,即俗稱“炮打隔子”。
-
卒(兵)在沒有過“河界”前,沒步只許向前直走一格;過“河界”後,每步可向前直走或橫走一格,但不能後退。
另外,在一個局面中,如果一方棋子能夠走到的位置有對方將(帥)的存在,那麼該局面就稱為將軍局面,我們的任務就是找出這樣的局面。根據上述規則,我們很容易就能推斷出只有以下幾種方式才會造成將軍局面:
-
將(帥)照面。即將和帥在同一直線上。
-
馬對將(帥)的攻擊。(注意馬有蹩腳)
-
車對將(帥)的攻擊。
-
炮對將(帥)的攻擊。(注意炮要隔一子)
-
過河兵對將(帥)的攻擊。
-
- 輸入
-
輸入的第一行為一個正整數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;
}