【圖(上)】拯救007
阿新 • • 發佈:2018-11-22
題目說明:
在老電影“007之生死關頭”(Live and Let Die)中有一個情節,007被毒販抓到一個鱷魚池中心的小島上,他用了一種極為大膽的方法逃脫 —— 直接踩著池子裡一系列鱷魚的大腦袋跳上岸去!
設鱷魚池是長寬為100米的方形,中心座標為 (0, 0),且東北角座標為 (50, 50)。池心島是以 (0, 0) 為圓心、直徑15米的圓。給定池中分佈的鱷魚的座標、以及007一次能跳躍的最大距離,你需要告訴他是否有可能逃出生天。
輸入格式:
首先第一行給出兩個正整數:鱷魚數量 N(≤)和007一次能跳躍的最大距離 D。隨後 N 行,每行給出一條鱷魚的 ( 座標。注意:不會有兩條鱷魚待在同一個點上)。
輸出格式:
如果007有可能逃脫,就在一行中輸出"Yes",否則輸出"No"。
圖的頂點:小島,鱷魚,岸邊
對圖中每一個結點,判斷如果該節點沒有訪問過且能到達,就從該節點深度優先遍歷,如果從該節點可以跳到岸邊,退出迴圈,是安全的。
深度優先遍歷時,對每一個訪問的結點設定該節點已經訪問過,並判斷從該節點是否可以一次跳到岸邊,可以的話直接返回,否則,對其他結點判斷,如果該節點可以到達且沒有訪問過,就對這個結點進行深度優先遍歷。
void Save007(Graph G)
{
for (each V in G)
{//visited[V]==true表示該結點已經訪問過了,FirstJump(V):可以到達結點V
if (!visited[V] && FirstJump(V))
{
answer = DFS(V);
if (answer == YES) break;
}
}
if (answer == YES) output("Yes");
else output("No");
}
int DFS(Vertex V)
{
visited[V] = true;
if ( IsSafe(V) ) answer = YES;//IsSafe(V):判斷在V點是否能到達岸邊
else
{
for (each W in G)
if (!visited[ W] && Jump(V,W))
{
answer = DFS(W);
if(answer == YES) break;
}
}
return answer;
}