訓練第二週之DFS 深度優先搜尋

2021-07-15 08:09:38 字數 2971 閱讀 7123

周一聽了副會長講課,講得不是很清楚,很迷糊的就去刷題去了,在題解和同學幫助下,花了大把大把的時間才刷了那麼幾題,結果對dfs還是不清楚,感覺事倍功半了。。。

感受:這題**簡單但是我覺得很有難度。

思路:f(n,m)為n個相同蘋果m個相同的盤子的放法,就分為兩種情況,至少乙個盤子是空的,所有盤子都有蘋果的。第一種情況,去掉空盤子沒影響,就是f(n,m)=f(n,m-1);第二種情況就是從所有盤子裡拿掉乙個蘋果也沒影響,即f(n,m)=f(n-m,m)。最終n會等於0或者m會等於1,以此來遞迴。

**:

#include

using

namespace

std;

int sum(int n,int m)

int main()

}

感受:週三一整天就撲在這上面了,還是想看了思路的。。。不過終究沒去看題解**還是挺讚的

思路:這題有2^64種情況,但是如果(1,j)亮,則(2,j)一定按,(1,j)不亮,(2,j)一定不按,這樣一行行看下去,那麼從按第一行開始,後面行數的按法就已經確定,所以只要把第一行列舉在分別判斷就行,就只有2^6種情況。

**:

#include

#include

#include

#include

using

namespace

std;

int j=1,k=0,t;

int state[80][10]=,ans[6][8],light[6][8];

int a[3]=;

int b[7]=;

void situation(int num1,int num0)//將num0個0和num1個1全排列

if(num0==0)

else

if(num1==0)

else

}int guess(int c)//判斷c這種熄燈方式能否使所以得燈滅掉,能則返回true,不能返回false

for(i=1;i<=6;i++)

}t++;

m=guess(light[t-1]);

if(m)

return

true;

else

return

false;

}void point(int c)//將符合條件的按法列印出來

printf("\n");

for(i=1;i<=6;i++)

}t++;

point(light[t-1]);

return;

}int main()

for(i=1;i<=5;i++)

for(s=1;s<=6;s++)

scanf("%d",&ans[i][s]);//輸入燈的狀態

for(i=0;imemcpy(light,ans,sizeof(ans));

t=1;

s=guess(state[i]);//判斷該按法能否全熄燈

if(s)

break;

}memcpy(light,ans,sizeof(ans));

t=1;

point(state[i]);//列印該按法

return

0;}

感受:這題錯了n次,樣例能過,但也只是樣例能過,我知道我的dfs寫錯了,最後只能抄題解

思路:按照每種移動的使用次數一次次遞迴下去,知道所有的鐘全在12點。

**:

#include

#include

#include

#include

using

namespace

std;

void dfs(int t,int dep);

int mi=2e9;//記錄最小步數

int b[20][20]=,,,,,,,,,};//9種移動

int times[10],ans[10],state[10];//每種移動的次數,最小步數的移動序列,九個時鐘的狀態

int first=1;

int main()

printf("\n");

return0;}

void dfs(int t,int dep)//t為移動的序號,dep為總移動步數

return;

}for(times[t]=0;times[t]<4;times[t]++)

dfs(t+1,dep+times[t]);

for(s=0;b[t][s]!=0;s++)//還原回溯

}return;

}

感受:比較簡單,一次過的,直接貼**了,不過副會長有說可以嘗試用bfs,不過我不會

**:

#include

#include

#include

#include

using

namespace

std;

int xi=1;

void dfs(int x,int y)

if(x>y)

swap(x,y);

if(y%2)

y=(y-1)/2;

else

y=y/2;

dfs(x,y);

}int main()

感受:講到bfs怎麼能少了八皇后呢,不過我覺得我寫得太複雜了,看來我在學校dfs上還有很長的路走啊

**:

#include

using

namespace

std;

int a[100]=,t=0;

int position[10][10]=;

void dfs(int n)

t++;

return;

}else

if(flag)

}return;

}}int main()

return

0;}

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...