nyoj 1034 將軍問題

2021-06-21 23:19:58 字數 2640 閱讀 7670

時間限制:

1000

ms  |  記憶體限制:

65535

kb難度:

3 描述

關於中國象棋,想必大家都很熟悉吧。我們知道,在走棋的時候,被對方將軍的這種情形是很容易被人察覺的(不然,你也太粗心了)。但是我們的計算機是如何識別這種情形的呢?它顯然沒有人的這種「直覺」。這就是我們今天要解決的問題,你的任務就是寫一段計算機**,根據當前局面資訊,判斷是否存在一方正在被另一方將軍的情形,並給出正確結果。

如圖一,象棋棋盤由九條豎線和十條橫線交叉組成。棋盤上共有九十個交叉點,象棋子就擺放在和活動在這些交叉點上。棋盤中間沒有畫通直線的地方,叫做「九宮」。棋子共有三十二個,分為紅、黑兩組,每組共十六個,各分七種,其名稱和數目如下:

各種棋子的走法如下:

另外,在乙個局面中,如果一方棋子能夠走到的位置有對方將(帥)的存在,那麼該局面就稱為將軍局面,我們的任務就是找出這樣的局面。根據上述規則,我們很容易就能推斷出只有以下幾種方式才會造成將軍局面:

將(帥)照面。即將和帥在同一直線上。

馬對將(帥)的攻擊。(注意馬有蹩腳)

車對將(帥)的攻擊。

炮對將(帥)的攻擊。(注意炮要隔一子)

過河兵對將(帥)的攻擊。

輸入

輸入的第一行為乙個正整數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

樣例輸出

noyes

#include #include int rx,ry,bx,by;

int map[12][12];

int ma()

if(map[bx-1][by+1]==0)

if(map[bx+1][by-1]==0)

if(map[bx+1][by+1]==0)

}for(int i=6;i<=7;i++)

if(map[rx-1][ry+1]==0)

if(map[rx+1][ry-1]==0)

if(map[rx+1][ry+1]==0)}}

return 0;

}int zu()

int ju(int x,int y)

else if(map[x][y]==17)

for(int i = 1 ; i <= 9 ;i++)

else if( i > y)}}

for(int i = 1 ; i <= 10 ; i++)

}if(i > x)}}

}return 0;

}int pao(int x,int y)

else if(map[x][y]==17)

for(int i = 1 ; i <= 9 ;i++)

}else if( i > y)}}

for(int i = 1 ; i <= 10 ; i++)

if(i > x)}}

return 0;

}int jun(int x,int y)

return 0;

}int main(void)

if(map[i][j]==17)

}int f2=ma();if(f2)

int f3=zu();if(f3)

int f5=ju(rx,ry);if(f5)

int f6=ju(bx,by);if(f6)

int f7=pao(rx,ry);if(f7)

int f8=pao(bx,by);if(f8)

int f9=jun(bx,by);if(f9)

printf("no\n");

} return 0;

}

拜占庭將軍問題

前進中的可信計算 拜占庭將軍問題 閔應驊 乙個可信的計算機系統必須容忍乙個或多個部件的失效。失效的部件可能送出相互矛盾的資訊給系統的其他部件。這正是目前網路安全要對付的情況,如銀行交易安全 存款安全。美國2001 9 11遭恐怖襲擊之後,大家普遍認識到銀行的異地備份非常重要。紐約的一家銀行可以在東京...

拜占庭將軍問題

假設有4個將軍圍攻乙個敵人,只有三個將軍同時出擊才可以將敵人擊敗,任意兩個或者乙個將軍出擊均會被敵人擊敗,4個將軍通過一對一的通訊機制協商共同出擊時機,同時4個將軍中有乙個是內奸,他會混淆通訊結果,避免3個將軍協商出統一的出擊時機。拜占庭將軍 pbft 問題既指在這種情況下將軍們如果達成共識,共同擊...

拜占庭將軍問題

拜占庭將軍問題 byzantine failures 是由萊斯利 蘭伯特提出的點對點通訊中的基本問題。含義是在存在訊息丟失的不可靠通道上試圖通過訊息傳遞的方式達到一致性是不可能的。因此對一致性的研究一般假設通道是可靠的,或不存在本問題。在很久很久以前,拜占庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼...