大号评测记录:https://www.luogu.com.cn/record/40963972
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[10001],vis[10001],comb[10001];
void dfs(int dep)
{
if(dep==n+1)
{
int flag=0;
for(int i=1;i<=k-1;i++)//把全排列筛选成组合数
{
if(a[i]>a[i+1])//组合数的特征
{
flag=1;
}
}
int flagn;
for(int i=1;i<=k;i++)//判断和上一位是否重复
{
if(a[i]==comb[i])
{
flagn=1;
}
else
{
for(int i=1;i<=k;i++)
{
comb[i]=a[i];
}
flagn=0;
}
}
if(!flag&&!flagn&&a[0]<=k)//如果没有上一位大于下一位的,且第一位(数最大的那位)要求小于k
{
for(int i=1;i<=k;i++)
{
printf("%3d",a[i]);
}
printf("\n");
}
else
{
return;
}
}
for(int i=1;i<=n;i++)
{
if(vis[i])//枚举出全排列
{
continue;
}
a[dep]=i;
vis[i]=true;
dfs(dep+1);
vis[i]=false;
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=k;i++)
{
cout<<" "<<i;
}
cout<<"\n";
dfs(1);
}
怎么优化