1. 程式人生 > >【圖(上)】拯救007

【圖(上)】拯救007

題目說明:

在老電影“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; }

參考博文:https://www.cnblogs.com/X-Do-Better/p/9048604.html