小s第一次接觸西洋棋。他發現西洋棋中的knight棋子的移動方式和中國象棋中的馬類似,移動方式如圖所示。
於是小s在棋盤上隨意擺上了一些棋子,其中包括一枚白騎士、一枚黑皇后、若干黑戰車和若干黑主教。
小s想知道,如何能在避開黑戰車和黑主教的攻擊範圍的前提下,花費更少的步數吃掉黑皇后。
注1:戰車的攻擊範圍呈直線,和中國象棋的車類似;主教的攻擊範圍呈斜線,無障礙物情況下可無限延伸。
注2:白騎士只能吃黑皇后,不可以吃掉黑戰車和黑主教。
輸入格式:
輸入僅包含一組樣例。
一組樣例包含8行(分別對應1-8行),每行包含8個字元,每個字元代表對應行對應列的棋盤格仔狀況。
其中』 . 『代**子上沒有擺放任何棋子;』 k '代**子上擺放的是白騎士; 』 q '代**子上擺放的是黑皇后; 』 r '代**子上擺放的是黑戰車; 』 b '代**子上擺放的是黑主教。
注:題目保證白騎士的初始位置不在黑戰車和黑主教的攻擊範圍內。
輸出格式:
如果白騎士可以在避開黑戰車和黑主教的攻擊的情況下吃掉黑皇后,則輸出花費步數的最小值;否則輸出"checkmate"。
輸入樣例1:
r.b.qb.r
........
........
........
........
........
........
.k......
輸出樣例1:
4
輸入樣例2:
....rr.q
........
.k......
........
........
........
........
........
輸出樣例2:
checkmate
#include
#include
#include
using namespace std;
char s[8]
[8];
int vis[8]
[8];
int x=
0,y=
0,minn=
99999
,flag=0;
struct node
;queuev;
void
f(int a,int b)
for(int i=a+
1,j=b-
1;i<
8&&i>=
0,j<
8&&j>=
0;i++
,j--
)for
(int i=a-
1,j=b+
1;i<
8&&i>=
0,j<
8&&j>=
0;i--
,j++
)for
(int i=a-
1,j=b-
1;i<
8&&i>=
0,j<
8&&j>=
0;i--
,j--)}
void
g(int a,int b)
for(int i=a-
1;i>=
0;i--
)for
(int i=a+
1;i<
8;i++
)for
(int i=a-
1;i>=
0;i--)}
void
dfs()if
(a+1
<
8&&b-
2>=
0&&s[a+1]
[b-2]==
'.'&&
!vis[a+1]
[b-2])
if(a+
2<
8&&b-
1>=
0&&s[a+2]
[b-1]==
'.'&&
!vis[a+2]
[b-1])
if(a+
1<
8&&b+
2<
8&&s[a+1]
[b+2]==
'.'&&
!vis[a+1]
[b+2])
if(a+
2<
8&&b+
1<
8&&s[a+2]
[b+1]==
'.'&&
!vis[a+2]
[b+1])
if(a-
1>=
0&&b+
2<
8&&s[a-1]
[b+2]==
'.'&&
!vis[a-1]
[b+2])
if(a-
2>=
0&&b+
1<
8&&s[a-2]
[b+1]==
'.'&&
!vis[a-2]
[b+1])
if(a-
1>=
0&&b-
2>=
0&&s[a-1]
[b-2]==
'.'&&
!vis[a-1]
[b-2])
if(a-
2>=
0&&b-
1>=
0&&s[a-2]
[b-1]==
'.'&&
!vis[a-2]
[b-1])
v.pop()
;}}int main()
for(int i=
0;i<
8;i++)if
(s[i]
[j]==
'k')}}
s[x]
[y]=
'.';
node q;
q.x=a;q.y=b;q.len=0;
v.push
(q);
dfs();
if(flag)
printf
("%d\n"
,minn)
;else
printf
("checkmate\n");
return0;
}
7 28 猴子選大王 20分 (佇列)
一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?輸入格式 輸入在一行中給乙個正整...
C 雜湊 二分 佇列例題 數對個數
給出一串數以及乙個數字 c,要求計算出所有 a b c 的數對的個數。規定 不同位置的數字一樣的數對算不同的數對。第一行包括 2 個非負整數 n 和 c c 0 中間用空格隔開。第二行有 n 個整數,中間用空格隔開,作為要求處理的那串數。輸出一行,表示該串數中包含的所有滿足 a b c 的數對的個數...
佇列判空 (二)佇列的實現
源於生活,抽象生活。生活中的佇列 當然是停車場排隊出場啦。計算機的佇列 簡答的說就是先入先出 fifo 在大腦中要有的概念是 隊頭 狀態 就是排隊第乙個交錢準備出場的車 隊尾 狀態 最後乙個排隊準備交錢的車 入隊 動作 add.把車開入 出停車場的道 出棧 動作 out.交完錢,把車開出停車場。fi...