dfs模板
DFS模板
- 1.dfs框架
- 2.dfs全排列
- 3.dfs組合+判斷素數
- 4.dfs排列問題
- 5. dfs組合問題
轉載自: https://www.cnblogs.com/irischen/p/DFS-usually.html
1.dfs框架
#include<bits/stdc++.h> using namespace std; int n, m;//n:有幾個數 m:要幾個 bool used[ ];//是否用過 int ans[ ];//答案 void dfs(int u){if (出局判斷){//到頭就走 做要做的事return ;//退出 }for (int i = 開始的地方; i <= n; i++)//從上一個數開始依次增加,枚舉每一種情況 if (used[i] == 0) {//判斷是否用過加入結果 設為用過dfs(u + 1);//下一個數字 回溯:回到沒用過}return ;//退出 } int main(){輸入 初始化dfs(1);//開始搜索,從1開始 return 0; }2.dfs全排列
#include<bits/stdc++.h> using namespace std; int n;//有幾個數 bool used[10];//是否用過 int ans[10];//答案 void dfs(int u){//u表示上一個if (u == n + 1){//到頭就走 for (int i = 1; i <= n; i++) printf("%d ", ans[i]);//輸出*1 printf("\n");//輸出*2 return ;//退出 }for (int i = 1; i <= n; i++)//枚舉每一種情況 if (used[i] == 0)//判斷是否用過 {ans[u] = i;//加入結果 used[i] = 1;//設為用過 dfs(u + 1);//下一個數字 used[i] = 0;//回溯:回到沒用過 }return ;//退出 } int main(){cin>>n;//輸入memset(used, 0, sizeof(used));//記得清零 dfs(1);//開始搜索,從1開始 return 0; }3.dfs組合+判斷素數
#include<bits/stdc++.h> using namespace std; int n, m;//n:有幾個數 m:要幾個 int a[30];//數字 int ans = 0;//方案個數 bool prime(int d) //素數檢測 {int s = sqrt(d);for (int i = 2; i <= s; i++)if (d % i == 0) return 0;return 1; } void dfs(int u, int opt, int sum){if (u == m + 1)//到頭就走{if (prime(sum))//判斷是否為素數ans++;return ;//退出}for (int i = opt + 1; i <= n; i++)//從上一個下標開始依次增加,枚舉每一種情況dfs(u + 1, i, sum + a[i]);//下一個數字return ;//退出 } int main(){scanf("%d %d", &n, &m);//輸入for (int i = 1; i <= n; i++) scanf("%d", &a[i]); //輸入dfs(1, 0, 0);//開始搜索,從1開始printf("%d", ans);return 0; }4.dfs排列問題
#include<bits/stdc++.h> using namespace std; int n, m;//n:有幾個數 m:要幾個 bool used[10];//是否用過 int ans[10];//答案 void dfs(int u){if (u == m + 1)//到頭就走 {for (int i = 1; i <= m; i++) printf("%d ", ans[i]);//輸出*1 printf("\n");//輸出*2 return ;//退出 }for (int i = 1; i <= n; i++)//枚舉每一種情況 if (used[i] == 0)//判斷是否用過 {ans[u] = i;//加入結果 used[i] = 1;//設為用過 dfs(u + 1);//下一個數字 used[i] = 0;//回溯:回到沒用過 }return ;//退出 } int main() {scanf("%d %d", &n, &m);//輸入 memset(used, 0, sizeof(used));//記得清零 dfs(1);//開始搜索,從1開始 return 0; }5. dfs組合問題
#include<bits/stdc++.h> using namespace std; int n, m;//n:有幾個數 m:要幾個 bool used[30];//是否用過 int ans[30];//答案 void dfs(int u){if (u == m + 1)//到頭就走 {for (int i = 1; i <= m; i++) printf("%d ", ans[i]);//輸出*1 printf("\n");//輸出*2 return ;//退出 }for (int i = ans[u - 1] + 1; i <= n; i++)//從上一個數開始依次增加,枚舉每一種情況 if (used[i] == 0)//判斷是否用過 {ans[u] = i;//加入結果 used[i] = 1;//設為用過 dfs(u + 1);//下一個數字 used[i] = 0;//回溯:回到沒用過 }return ;//退出 } int main(){scanf("%d %d", &n, &m);//輸入 memset(used, 0, sizeof(used));//記得清零 ans[0] = 0;//重點:注意當u=1時的極限情況清零 dfs(1);//開始搜索,從1開始 return 0; }總結
- 上一篇: 电表怎么读数?
- 下一篇: pip报 No module named