HDU4528 小明系列故事 捉迷藏 BFS

2021-08-17 10:49:20 字數 2421 閱讀 6241

小明的媽媽生了三個孩子,老大叫大明, 老二叫二明, 老三…, 老三自然就叫小明了。

一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,

於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單:

只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩個人猜拳決定誰在下一輪負責找人;如果在規定的時間內只找到乙個人,那麼沒有被發現的人獲勝,被找到的人下一輪負責找人;如果在規定的時間內乙個人都沒有找到,則小明失敗了,下一輪還是他來找人。現在小明想知道,在規定時間內,自己是否可以找到所有的人,現在他想請你來幫忙計算一下。

為了簡單起見,把公園看成是n行m列的矩陣,其中』s』表示小明,』d』表示大名,』e』表示二明,』x』表示障礙物,』.』表示通路。這裡,我們把發現定義為,可以直接看到對方,

也就是說兩個人在同一行或者同一列,並且中間沒有障礙物或者沒有其他人就可以看到對方。並且假設,大明,二明藏好以後就不會再改變位置,小明每個單位時間可以從當前的位置走到相鄰的四個位置之一,並且不會走出公園。

測試資料第一行是乙個正整數t,表示有t組測試資料。

每一組測試資料首先是三個正整數n,m,t,分別表示行數、列數和規定的時間,接下來n行,每行m個上述的字元,並且保證有且只有乙個』s』,乙個』e』,乙個』d』。

[technical specification] t < 200 3 <= n, m <= 100 0 <= t <= 100

每組先輸出一行case c:(c表示當前的組數,從1開始計數);

接下來一行,如果小明可以在規定時間內找到所有的人,則輸出最少需要的時間,否則輸出-1。

3

5 6 3

xxd...

....e.

....x.

....s.

......

5 6 3

xdx...

....e.

......

....s.

......

5 6 8

xxdx..

.xex..

......

....s.

......

case 1:

-1case 2:

3case 3:

-1

本題有幾個要點:

把發現定義為,可以直接看到對方, 也就是說兩個人在同一行或者同一列,並且中間沒有障礙物或者沒有其他人就可以看到對方

所以當小明看見了大明或者二明,但是這兩個人緊挨著,那麼小明只能看見乙個人,當前這個人也算做乙個障礙物,比如樣例3。

我們可以設定乙個變數flag來表示當前的狀態,然後利用二進位制中的或運算,當最後的結果通過或運算變成3的時候,證明現在已經找到了,可以直接輸出結果。我們先找到大明和二明的座標進行預處理,並存入dp陣列裡面,通過或運算就知道了大明二明所在的十字路線上的所有的狀態,然後進行廣搜。在判斷條件的時候要判斷,越界,當前狀態是否被標記過,步數是不是滿足條件,當前走的是不是.或者s(起點可以重複走)

#include 

using

namespace

std;

#define mem(a,b) memset(a,b,sizeof(a))

const

int n=100+10;

int sx,sy,ex,ey,dx,dy,n,m,k;

char e[n][n];

int vis[n][n][10],dp[n][n];

int go[4][2]= ;

void init(int x,int y,int c)

break;

}for(int i=x+1; iif(e[i][y]=='.'||e[i][y]=='s')

break;

}for(int i=y-1; i>=0; i--)

break;

}for(int i=y+1; iif(e[x][i]=='.'||e[x][i]=='s')

break;

}}struct node

;int bfs(int x,int y)}}

return -1;

}int main()

if(e[i][j]=='d')

if(e[i][j]=='e')}}

mem(dp,0);

init(ex,ey,2);

init(dx,dy,1);

printf("case %d:\n%d\n",q++,bfs(sx,sy));

}return

0;}

HDU 4528 小明系列故事 捉迷藏

小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三.老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩...

hdu 4528小明系列故事 捉迷藏 (bfs)

題意 就是三個傻明玩捉迷藏,小明負責找大的和二的,直線可以看見就算找到,人擋著人都不行!問小明可不可以在規定時間完成任務。思路 就是正常的bfs,只不過有些細節處理需要注意,比如能否看到大明二明,保證兩點中間都是 還有就是去重,這裡需要注意,小明是可以走回頭路的,比如大明在左上,二明在右上,小明就要...

hdu4528 小明系列故事 捉迷藏 解題報告

problem description 小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三.老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時...