问题 H: 递归/非递归实现组合型枚举
时间限制: 1 Sec 内存限制: 128 MB
提交: 43 解决: 21
[提交] [状态] [讨论版] [命题人:admin]
题目描述
从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。n>0, 0<=m<=n, n+(n-m)<=25。
输入
一个整数n。
输出
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。
样例输入
5 3
样例输出
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+100;
const int INF=1e9;
const int MOD=1e8;
int a[20],n,m;
void fun(int k,int x)
{
if(x>n)
{
if(k-1==m && m>0)
{
for(int i=1;i<=(k-2);i++) cout<<a[i]<<" ";
cout<<a[k-1]<<endl;
}
return ;
}
a[k]=x;
fun(k+1,x+1);
fun(k,x+1);
}
int main()
{
scanf("%d%d",&n,&m);
fun(1,1);
return 0;
}
问题 J: 递归实现排列型枚举
时间限制: 1 Sec 内存限制: 128 MB
提交: 40 解决: 21
[提交] [状态] [讨论版] [命题人:admin]
题目描述
把 1~n 这 n(n<10) 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入
一个整数n。
输出
按照从小到大的顺序输出所有方案,每行1个。 首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
样例输入
3
样例输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+100;
const int INF=1e9;
const int MOD=1e8;
int a[10];
void fun(int n,int x)
{
if(x==n){
for(int i=0; i<n-1; i++) printf("%d ",a[i]);
printf("%d\n",a[n-1]);
return ;
}
int f=1;
for (int i = 1; i <= n; ++i) {
f=1;
for(int j=0; j<x; j++){
if(a[j]==i) f=0;
}
if(f){
a[x]=i;
fun(n,x+1);
}
}
}
int main()
{
int n;
scanf("%d",&n);
fun(n,0);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+100;
const int INF=1e9;
const int MOD=1e8;
int a[10],vis[10];
int n;
void fun(int k)
{
if(k>n){
for(int i=1; i<=n-1; i++){
printf("%d ",a[i]);
}
printf("%d\n",a[n]);
return ;
}
for(int i=1; i<=n; i++){
if(!vis[i]){
vis[i]=1;
a[k]=i;
fun(k+1);
a[k]=0;
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
fun(1);
return 0;
}
可以直接用STL里的函数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e6+100;
const int INF=1e9;
const int MOD=1e8;
int a[10];
int main()
{
int n;
int a[10];
scanf("%d",&n);
for(int i=0; i<n; i++){
a[i]=i+1;
}
do{
for(int i=0; i<n-1; i++){
printf("%d ",a[i]);
}
printf("%d\n",a[n-1]);
}while(next_permutation(a,a+n));
return 0;
}