全排列
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n;
int ans[N];
bool vis[N];
void print()
{
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k)
{
if(k==n+1){
print();
return;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = i;
dfs(k+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}
n个数选r个的排列(1-n)
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n,r;
int ans[N];
bool vis[N];
void print()
{
for(int i=1;i<=r;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k)
{
if(k==r+1){
print();
return;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = i;
dfs(k+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n>>r;
dfs(1);
return 0;
}
n个数选r个的组合(1-n)
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n,r;
int ans[N];
bool vis[N];
void print()
{
for(int i=1;i<=r;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k)
{
if(k==r+1){
print();
return;
}
for(int i=ans[k-1]+1;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = i;
dfs(k+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n>>r;
dfs(1);
return 0;
}
n个数的排列 (每个数都是输入进来的)
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n;
int ans[N];
int nums[N];
bool vis[N];
void print()
{
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k)
{
if(k==n+1){
print();
return;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = nums[i];
dfs(k+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>nums[i];
dfs(1);
return 0;
}
n个数选r个的排列 (每个数都是输入进来的)
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n,r;
int ans[N];
int nums[N];
bool vis[N];
void print()
{
for(int i=1;i<=r;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k)
{
if(k==r+1){
print();
return;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = nums[i];
dfs(k+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n>>r;
for(int i=1;i<=n;i++) cin>>nums[i];
dfs(1);
return 0;
}
n个数选r个的组合(每个数都是输入进来的)
#include <bits/stdc++.h>
using namespace std;
const int N = 30;
int n,r;
int ans[N];
int nums[N];
bool vis[N];
void print()
{
for(int i=1;i<=r;i++) cout<<ans[i]<<" ";
cout<<endl;
}
void dfs(int k,int s)
{
if(k==r+1){
print();
return;
}
for(int i=s;i<=n;i++)
{
if(!vis[i])
{
vis[i] = true;
ans[k] = nums[i];
dfs(k+1,i+1);
vis[i] = false;
}
}
}
int main()
{
cin>>n>>r;
for(int i=1;i<=n;i++) cin>>nums[i];
dfs(1,1);
return 0;
}
DFS的关于排列组合的所有操作