深度优先搜索(DFS)相关习题
生活随笔
收集整理的這篇文章主要介紹了
深度优先搜索(DFS)相关习题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 問題 A: 【遞歸入門】全排列 【簡單】
- 問題 B: 【遞歸入門】組合的輸出 【簡單】
- 問題 C: 【遞歸入門】組合+判斷素數 【中】
- 問題 D: 【遞歸入門】n皇后 問題(原始的8皇后問題)【中】
- 問題 E: 【遞歸入門】出棧序列統計 【中】
- 問題 F: 【遞歸入門】走迷宮 【中】
問題 A: 【遞歸入門】全排列 【簡單】
http://codeup.cn/problem.php?cid=100000608&pid=0
問題 B: 【遞歸入門】組合的輸出 【簡單】
http://codeup.cn/problem.php?cid=100000608&pid=1
問題 C: 【遞歸入門】組合+判斷素數 【中】
http://codeup.cn/submitpage.php?cid=100000608&pid=2&langmask=0
#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<map> #define max 30using namespace std; int a[max];//數據 int c[max];//保存選的方式 bool b[max];//選沒選 int n; int k; int ans=0;//總數 //map<int,bool>ways;//記錄這個數選沒選bool judge(int sum) {int i=2;if(sum==2)return true;if(sum==1)return false;while(i<= (int)sqrt(1.0*sum) ){if(sum%i==0)return false;i++;}return true; } void dfs(int index,int start) {if(index==k+1){long long sum=0;for(int i=1;i<=k;i++){sum+=c[i];}if(judge(sum)){ans++;}return;}int i;for(i=start;i<=n;i++){if(b[i]==false){b[i]=true;c[index]=a[i];dfs(index+1,i);b[i]=false;}} } int main(void) {while(cin>>n>>k){for(int i=1;i<=n;i++){cin>>a[i];}dfs(1,1);printf("%d\n",ans);ans=0;}return 0; }第二種方法:
#include<cstdio> #include<iostream> #include<cmath> using namespace std; int n,r; int a[30]; int b[30]; int ans=0; bool judge(int s) {if(s==2) return true;int temp=sqrt(s);for(int i=2;i<=temp;i++){if(s%i==0)return false;}return true; } void dfs(int index,int sum)//第幾個選,選了幾個 {if(sum>r) return;//選的個數超過 rif(index==n){if(sum==r){int m=0;for(int i=0;i<n;i++){if(b[i]==1){m+=a[i];}}if(judge(m))ans++;}return ;}b[index]=1;//選dfs(index+1,sum+1);b[index]=2;//不選dfs(index+1,sum); } int main(void) {cin>>n>>r;for(int i=0;i<n;i++) cin>>a[i];dfs(0,0);cout<<ans<<endl;return 0; }問題 D: 【遞歸入門】n皇后 問題(原始的8皇后問題)【中】
#include<cstdio> #include<iostream> #include<cmath> using namespace std; int n; bool flag=true; int a[20]; bool b[20]; void dfs(int index) {if(index==n+1){for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(abs(i-j)==abs(a[i]-a[j]))//判斷是否在對角線上{return;}}}for(int i=1;i<=n;i++) printf("%d ",a[i]);flag=false;printf("\n");return ;}for(int i=1;i<=n;i++){if(!b[i]){b[i]=true;a[index]=i;dfs(index+1);b[i]=false;}} } int main(void) {cin>>n;dfs(1);if(flag)printf("no solute!\n");return 0; }用現有的全排列函數
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> using namespace std; int a[30]; bool flag=false; int main(void) {int n; cin>>n;for(int i=1;i<=n;i++) a[i]=i;do{bool f=false;for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){if(abs(i-j)==abs(a[i]-a[j])){f=true;break;}}if(f) break; }if(f) continue;for(int i=1;i<=n;i++) printf("%d ",a[i]);printf("\n");flag=true;}while(next_permutation(a+1,a+n+1));if(!flag){printf("no solute!\n");}return 0; }問題 E: 【遞歸入門】出棧序列統計 【中】
http://codeup.cn/problem.php?cid=100000608&pid=4
簡潔版代碼:
#include<iostream> using namespace std; int n; int ans=0; void dfs(int index,int sum) {if(sum==0) ans++;else if(index==0) dfs(index+1,sum-1);else{dfs(index+1,sum-1);dfs(index-1,sum);} } int main(void) {cin>>n;dfs(0,n);cout<<ans<<endl;return 0; }問題 F: 【遞歸入門】走迷宮 【中】
http://codeup.cn/problem.php?cid=100000608&pid=5
總結
以上是生活随笔為你收集整理的深度优先搜索(DFS)相关习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一章:递推与递归 【完结】
- 下一篇: algorithm头文件下的常用函数--