DFS 記錄路徑 挖地雷

2021-10-19 13:17:38 字數 1530 閱讀 1114

在乙個地圖上有n個地窖(n≤20),每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖(僅能選擇一條路徑),當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使某人能挖到最多的地雷。

有若干行。

第1行只有乙個數字,表示地窖的個數n。

第2行有n個數,分別表示每個地窖中的地雷個數。

第3行至第n+1行表示地窖之間的連線情況:

第3行有n−1個數(0或1),表示第乙個地窖至第2個、第3個、…、第n個地窖有否路徑連線。如第3行為11000 …0,則表示第1個地窖至第2個地窖有路徑,至第3個地窖有路徑,至第4個地窖、第5個、…、第n個地窖沒有路徑。

第4行有n−2個數,表示第二個地窖至第3個、第4個、…、第n個地窖有否路徑連線。

… …第n+1行有1個數,表示第n−1個地窖至第n個地窖有否路徑連線。(為0表示沒有路徑,為1表示有路徑)。

有兩行第一行表示挖得最多地雷時的挖地雷的順序,各地窖序號間以乙個空格分隔,不得有多餘的空格。

第二行只有乙個數,表示能挖到的最多地雷數。

輸入

5

10 8 4 7 6

1 1 1 0

0 0 0

1 11

輸出
1 3 4 5

27

思路:很明顯的一道dfs題,但是增加了乙個問題,怎麼記錄路徑?這個關鍵是判斷這個找地洞什麼時候結束,結束的時候將路徑儲存進乙個陣列即可。寫好check函式就好,即那個洞窟沒有其他可到達的洞窟。

**如下:

#include

#include

#include

using

namespace std;

int lei_num[22]

;int link[21]

[21];

int path[22]

;int res[22]

;int max_lei=-1

,n,len;

int visited[22]

;bool

check

(int x)

return

true

;//沒有洞可通

}void

dfs(

int start,

int count,

int step)

return;}

for(i=

1;i<=n;i++)}

}int

main()

}for

(i=1

;i<=n;i++

)for

(i=0

;i1;i++

) cout << res[i]

<<

" ";

cout << res[len-1]

<< endl;

cout << max_lei << endl;

return0;

}

挖地雷問題

問題描述 在乙個地圖上有n個地窖 n 20 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。如圖3 圖3當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖 僅能選擇一條路徑 當無連線時挖地雷工作結束。設計乙個挖地雷的方案,使某人能挖到最多的地雷。輸入檔...

挖地雷問題

目錄dp二 使用一維陣列 在一條公路上埋有若干堆地雷,每堆地雷有一定的數量,地雷堆的編號為1,2,n,例如,埋有地雷數量如下 8 14 2 17 33 26 15 17 19 6此時,地雷的數量可用一維陣列a n 表示。同時,給出地雷堆之間的聯絡,從第1堆開始,它指出挖了此堆之後,還可以選擇繼續往下...

挖地雷問題 DP

挖地雷問題 p3.pas c cpp 問題描述 在乙個地圖上有n個地窖 n 20 每個地窖中埋有一定數量的地雷。同時,給出地窖之間的連線路徑。如圖3 圖3當地窖及其連線的資料給出之後,某人可以從任一處開始挖地雷,然後可以沿著指出的連線往下挖 僅能選擇一條路徑 當無連線時挖地雷工作結束。設計乙個挖地雷...