周一聽了副會長講課,講得不是很清楚,很迷糊的就去刷題去了,在題解和同學幫助下,花了大把大把的時間才刷了那麼幾題,結果對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 重複...