DFS & BFS【搜尋】
阿新 • • 發佈:2020-07-27
DFS模板
void dfs(int depth)//depth表示當前的層數(或深度) { if(depth>n)//到達葉子節點,該路已走到盡頭 return; for(int i=1;i<=n;i++)//n表示最大的值,即最大深度為n { if(b[i]==0)//b陣列表示探索的狀態,1表示已被探索,0表示尚未被探索 { b[i]=1;//標記當前的b[i]已被探索 a[level]=i;//記錄當前的節點值 dfs(level+1);//進一步的搜尋 b[i]=0;//還原當前的b[i]元素被探索的狀態 } } }
題目描述
排列與組合是常用的數學方法。
先給一個正整數 ( 1 < = n < = 10 )
例如n=3,所有組合,並且按字典序輸出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
輸入
輸入一個整數n( 1<=n<=10)
輸出
輸出所有全排列
每個全排列一行,相鄰兩個數用空格隔開(最後一個數後面沒有空格)
樣例輸入Copy
3
樣例輸出Copy
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
#include<bits/stdc++.h> #include<queue> using namespace std; const int N=100; typedef long long ll; int n,a[10010],b[10010]; void print() { for(int i=1;i<=n;i++) { printf("%5d",a[i]); } cout<<endl; } void dfs(int level) { if(level==n+1) { print();return; } for(int i=1;i<=n;i++) { if(b[i]==0) { b[i]=1; a[level]=i; dfs(level+1); b[i]=0; } } } int main() { cin>>n; dfs(1); }
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,y[100010],s,ans[100010]; bool check(int x)//剪枝,判斷兩點的位置\\ 兩點的斜率的絕對值不得等於1;兩點不得在同一水平線上(包括同一行和同一列) { for(int i=1;i<x;i++)//i本身就是指行號,y[i]表示對應的列號 { if(abs(x-i)==abs(y[x]-y[i])||y[x]==y[i]||x==i) { return 0; } } return 1; } void dfs(int num) { if(num>n)//越界處理 { s++; return; } for(int i=1;i<=n;i++) { y[num]=i;//將當前的行號賦值給第num個皇后 if(check(num)) dfs(num+1);//進行下一步的搜尋 } } int main() { for(int i=1;i<=10;i++) { n=i; s=0; dfs(1); ans[i]=s; } while(~scanf("%d",&n)&&n) printf("%d\n",ans[n]); }