一)全排列
#include <bits/stdc++.h>
using namespace std;
vector <int> vc1;
vector <int> vc2;
int n,m;
int mb[100];
void dfs(int st){
// 递归出口 end
if (st == n + 1){
for (auto g : vc2)
cout << " " << g;
cout << endl;
return ;
}
for (auto g : vc1){
if (mb[g]) //这个数填过了
continue;
mb[g] = 1;//标记这个数,表示填过了
vc2.push_back(g);
dfs(st + 1);
mb[g] = 0;//释放这个数,进行下次操作
vc2.pop_back();
}
return;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
vc1.push_back(i);
}
dfs(1);
return 0;
}
二)选数
#include<bits/stdc++.h>
using namespace std;
int n,k;
int ans;
int a[30];
int fun(int m){//判断素数
if(m<=3)
return m>=2;
for(int i=2;i<=sqrt(m);i++)
if(m%i==0)
return 0;
return 1;
}
void dfs(int st,int f,int sum){
if(st == n+1){
if(f!=k)//不满足k个数
return;
if(fun(sum)==0)//不是素数
return;
ans++;
return ;
}
dfs(st+1,f+1,sum+a[st]);
//选这个数
dfs(st+1,f,sum);
//不选这个数
}
int main(){
int i;
cin>>n>>k;
for(i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,0,0);
cout<<ans;
}
三)连通块
#include <bits/stdc++.h>
using namespace std;
vector<int> vc[100];
int bk[100];
int n,m;
int ans=0;
void dfs(int u){
if(bk[u]){
//判断这个点是否已经访问过了
return ;
}
bk[u]=1;
for(auto g:vc[u]){
//遍历vc[u]是否还有其他路径可以走
dfs(g);
}
return ;
}
int main(){
cin>>n>>m;
for(int x,y,i=1;i<=m;i++){
cin>>x>>y;
vc[x].push_back(y);
vc[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(bk[i])//如果这个点被访问过了就不用在找了
continue;
dfs(i);
ans++;
}
cout<<ans<<endl;
return 0;
}