白騎士的移動 20分 佇列實現

2021-10-02 10:04:23 字數 3280 閱讀 4123

小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...