鈺的DFS學習筆記

2021-10-12 06:57:57 字數 4415 閱讀 3898

int check(引數)

void dfs(int step)

嘗試每一種可能

輸出自然數 11 到 nn 所有不重複的排列,即 nn 的全排列,要求所產生的任一數字序列中不允許出現重複的數字。

乙個整數 nn。

由 1 \sim n1∼n 組成的所有不重複的數字序列,每行乙個序列。

每個數字保留 55 個場寬。

輸入 #1複製

3
輸出 #1複製

1    2    3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

1 \leq n \leq 91≤n≤9

#includeusing namespace std;

int a[101],b[101],n;

void print()

高手最近談戀愛了。不過是單相思。「即使是單相思,也是完整的愛情」,高手從未放棄對它的追求。今天,這個陽光明媚的早晨,太陽從西邊緩緩公升起。於是它找到高手,希望在晨讀開始之前和高手一起在鰲頭山上一起散步。高手當然不會放棄這次夢寐以求的機會,他已經準備好了一切。

第一行,兩個用空格隔開的整數n、m. 之後m行,為每條遊步道的資訊:兩端觀景點編號、長度。

乙個整數,表示他們最長相伴的路程。

輸入 #1複製

4 6

1 2 10

2 3 20

3 4 30

4 1 40

1 3 50

2 4 60

輸出 #1複製

150
對於100%的資料:n≤20,m≤50,保證觀景點兩兩之間不會有多條遊步道連線.

#includeusing namespace std;

const int n=1010;

int g[n][n],dist,maxn=-10,n,m,x,y,z;

bool vis[n];

void dfs(int st)

} maxn=max(maxn,dist);//更新最大值

vis[st]=0;

return ;

}int main()

for(int i=1;i<=n;i++)

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

有若干行。

第11行只有乙個數字,表示地窖的個數nn。

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

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

第33行有n-1n−1個數(00或11),表示第乙個地窖至第22個、第33個、…、第nn個地窖有否路徑連線。如第33行為1 1 0 0 0 … 011000…0,則表示第11個地窖至第22個地窖有路徑,至第33個地窖有路徑,至第44個地窖、第55個、…、第nn個地窖沒有路徑。

第44行有n-2n−2個數,表示第二個地窖至第33個、第44個、…、第nn個地窖有否路徑連線。

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

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

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

輸入 #1複製

510 8 4 7 6

1 1 1 0

0 0 0

1 11

輸出 #1複製

1 3 4 5

27

#includeusing namespace std;

bool f[21][21],b[21];//f記錄是否有路徑相連,b檢測這點是否走過

int a[21];//記錄地雷數

int path[21],ans[21],cnt;//path記錄路徑,ans記錄答案,cnt記錄走了多少個點

int n;

int maxn;// 最大值

bool check(int x)

return true;

}void dfs(int x,int stp,int sum)

for(int i=1;i<=cnt;i++)

cout給一n \times nn×n的字母方陣,內可能蘊含多個「yizhong

」單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 88 個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用*代替,以突出顯示單詞。例如:

輸入:

8 輸出:

qyizhong *yizhong

gydthkjy gy******

nwidghji n*i*****

orbzsfgz o**z****

hhgrhwth h***h***

zzzzzozo z****o**

iwdfrgng i*****n*

yyyygggg y******g

第一行輸入乙個數nn。(7 \le n \le 1007≤n≤100)。

第二行開始輸入n \times nn×n的字母矩陣。

突出顯示單詞的n \times nn×n矩陣。

輸入 #1複製

7

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

輸出 #1複製

*******

*******

*******

*******

*******

*******

*******

輸入 #2複製

8

qyizhong

gydthkjy

nwidghji

orbzsfgz

hhgrhwth

zzzzzozo

iwdfrgng

yyyygggg

輸出 #2複製

*yizhong

gy******

n*i*****

o**z****

h***h***

z****o**

i*****n*

y******g

#includeusing namespace std;

const int maxn=110;

const string cmp="yizhong";

int dx=;

int dy=;

char a[maxn][maxn],ans[maxn][maxn];

int mark[maxn][maxn],n;

void dfs(int x,int y)

if(cmp[j]!=a[xx][yy])

}if(flag==0) continue;

for(int j=0;j<=6;j++)//一定要從0開始,不然y會不見,別問我怎麼知道的 }

return ;

}int main()

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

cout<

} return 0;

}

dfs學習筆記整理

dfs題型 1.連通塊 就是標記畫圖,算出每個小模組個數 2.尋找到達終點的途徑數 理解dfs其實會無數次到達終點後,每次到達就ans 就可以算出,但是注意回溯時vis x y 要清0.例如下面這個 include include includeusing namespace std const i...

dfs學習筆記 1

這篇文大概就是自己在學習過程中學到的一些模板和注意事項吧,emmm在此先膜拜各路大佬orz 先貼核心 void dfs 引數用來表示狀態 if 越界或者是不合法狀態 return if 特殊狀態 剪枝 return for 擴充套件方式 要注意路徑記錄和節點重判!然後接下來是一些最最最基礎的dfs的...

DFS序學習筆記

1.定義及理解 dfs序是深度優先遍歷一顆樹的時候產生的時間戳序列,可以將樹形結構有序地轉化為線性結構,從而將樹上問題轉化為線性問題 這時,我們就可以用許多優秀的資料結構,比如維護區間的線段樹 樹狀陣列等方便地處理樹上問題啦!2.重要的性質 1 設in x 表示第一次dfs到x節點的時間戳,out ...