小明的媽媽生了三個孩子,老大叫大明, 老二叫二明, 老三..., 老三自然就叫小明了。
一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身, 於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單:
只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩個人猜拳決定誰在下一輪負責找人;如果在規定的時間內只找到乙個人,那麼沒有被發現的人獲勝,被找到的人下一輪負責找人;如果在規定的時間內乙個人都沒有找到,則小明失敗了,下一輪還是他來找人。現在小明想知道,在規定時間內,自己是否可以找到所有的人,現在他想請你來幫忙計算一下。
為了簡單起見,把公園看成是n行m列的矩陣,其中』s』表示小明,』d』表示大名,』e』表示二明,』x』表示障礙物,』.』表示通路。這裡,我們把發現定義為,可以直接看到對方, 也就是說兩個人在同一行或者同一列,並且中間沒有障礙物或者沒有其他人就可以看到對方。並且假設,大明,二明藏好以後就不會再改變位置,小明每個單位時間可以從當前的位置走到相鄰的四個位置之一,並且不會走出公園。
input測試資料第一行是乙個正整數t,表示有t組測試資料。
每一組測試資料首先是三個正整數n,m,t,分別表示行數、列數和規定的時間,接下來n行,每行m個上述的字元,並且保證有且只有乙個』s』,乙個』e』,乙個』d』。
[technical specification]
t < 200
3 <= n, m <= 100
0 <= t <= 100
output每組先輸出一行case c:(c表示當前的組數,從1開始計數);
接下來一行,如果小明可以在規定時間內找到所有的人,則輸出最少需要的時間,否則輸出-1。
sample input
3sample output5 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
要注意的是:因為路徑可以重複,要用四維陣列來標記,除了記錄位置外還要記錄此時的狀態,其餘的直接用廣搜的模板就行了。
**:
#include#include#include#includeusing namespace std;
char map[105][105];
int n,m,t,sx,sy;
int go[4][2]=,vis[3][3][105][105];
struct node
no,ne;
void pan(node &p)
else if(map[i][p.y]=='e')
else if(map[i][p.y]=='x')break;
}for(int i=p.x+1;i=0;i--)
else if(map[p.x][i]=='e')
else if(map[p.x][i]=='x')break;
}for(int i=p.y+1;iw;
no.x=sx,no.y=sy;
no.e=0,no.d=0,no.s=0;
pan(no);
w.push(no);
while(!w.empty())
}return -1;
}int main()
printf("case %d:\n%d\n",k++,bfs());
}return 0;
}
小明系列故事 捉迷藏
題目鏈結 剛開始的思路是直接整,把能看見的大明,二明的地方全部標記出來 但是交叉的地方又不好標記 而且如何判定既看到大明,又看到二明 直到看到了大神 每走一步,判斷一下有沒有看見大明或者二明 如果看到大明返回1,看見二明返回2,兩個都看見返回3,乙個沒看見返回0 用s代表當前看到幾個人 每次向下搜尋...
hdu 4528小明系列故事 捉迷藏 (bfs)
題意 就是三個傻明玩捉迷藏,小明負責找大的和二的,直線可以看見就算找到,人擋著人都不行!問小明可不可以在規定時間完成任務。思路 就是正常的bfs,只不過有些細節處理需要注意,比如能否看到大明二明,保證兩點中間都是 還有就是去重,這裡需要注意,小明是可以走回頭路的,比如大明在左上,二明在右上,小明就要...
HDU4528 小明系列故事 捉迷藏 BFS
小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三 老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩...