全部排列问题
题目描述:输出 1…n 个数的全部排列。全部排列中,数字可以重复 。 例如输入 3 输出全部排列的结果如下:1
11、112、113、121、122、123、131、132、133、211、212、213、221、 222、223、231、232、233、311、312、313、321、322、323、331、332、333。
输入 一个整数 n(1<=n<=6) 输出 1按照由小到大的顺序输出 1…n 这 n 个数的全部排列情况。
输入复制
2
输出复制
11
12
21
22
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110]={0};
int main()
{
int n;
cin>>n;
func(n,0);
return 0;
}
void func(int n,int k)
{
if(k>=n)
{
for(int i=0;i<k;i++)cout<<a[i];
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
a[k]=i;
func(n,k+1);
}
}
全排列的结果
题目描述:从键盘读入一个整数 n,请输出 1∼n 中所有整数的全排列,按照由小到大输出结果,每组的 n 个数之 间用空格隔开。
全排列的含义:从 n 个不同元素中任取 m (m≤n)个元素,按照一定的顺序排列起来,叫做从 n 个 不同元素中取出 m 个元素的一个排列。当 m=n 时所有的排列情况叫全排列。
如当 n=3 时,全排列的结果为:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
输入 一个整数 n(≤1≤n≤6); 输出 1∼n 中所有数的全排列的结果,按照由小到大输出,每行 n 个数。
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110]={0};
int b[110]={0};
int main()
{
int n;
cin>>n;
func(n,0);
return 0;
}
void func(int n,int k)
{
if(k>=n)
{
for(int i=0;i<k;i++)cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
a[k]=i;
b[i]=1;
func(n,k+1);
b[i]=0;
}
}
}
n个数的全排列
题目描述: 从键盘读入 n 个整数(每个数都是 1∼9 之间的数),输出这 n 个整数的全排列(数字不能 重复)。 输入 第 1 行输入一个整数 n。(1≤n≤8) 第 2 行输入 n 个不相等的整数。(每个数在 [1,9] 的范围内) 输出 输出若干行,每行包括 n 个数据,表示一种排列方案,所有的排列按字典码从 小到大排序输出。 样例
输入复制
3
4 6 2
输出复制
2 4 6
2 6 4
4 2 6
4 6 2
6 2 4
6 4 2
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110]={0};
int b[110]={0};
int c[110]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
func(n,0);
return 0;
}
void func(int n,int k)
{
if(k>=n)
{
for(int i=0;i<k;i++)cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
a[k]=c[i];
b[i]=1;
func(n,k+1);
b[i]=0;
}
}
}
n个数取出r个数排列
题目描述:从 1∼n 任意挑出 r 个数进行排列,请从小到 大输出所有可能的排列结果。
如:n=5,r=2,则输出结果如下
1 2
1 3
1 4
1 5
2 1
2 3
2 4
2 5
3 1
3 2
3 4
3 5
4 1
4 2
4 3
4 5
5 1
5 2
5 3
5 4
输入 两个整数 n 和 r ( n 和 r 都是 3∼6 之间的整数) 输出 从 1∼n 中取出 r 个数的排列结果!
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110]={0};
int b[110]={0};
int r;
int main()
{
int n;
cin>>n>>r;
func(n,0);
return 0;
}
void func(int n,int k)
{
if(k>=r)
{
for(int i=0;i<k;i++)cout<<a[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(b[i]==0)
{
a[k]=i;
b[i]=1;
func(n,k+1);
b[i]=0;
}
}
}
谷仓的保安
题目描述:Farmer John给谷仓安装了一个新的安全系统,并且要给牛群中的每一个奶牛安排一个有效的密码。
组成一个有效的密码要遵守以下条件:
1.由 L (3≤L≤15)个小写字母(来自传统的拉丁字母集'a'...'z')组成。
2.至少有一个元音('a', 'e', 'i', 'o', 'u')。
3.至少两个辅音 (除去元音以外的音节)。
4.有按字母表顺序出现的字母(例如,'abc'是有效的,而'bac'不是) 。
给定一个期望长度 L 和 C 个小写字母,写一个程序,打印出所有的长度为 L、能由这些字母组成的有效密码。密码必须按字母表顺序打印出来,一行一个。 输入 第一行: 两个由空格分开的整数,L 和 C 。(3≤C≤26) 第二行: C 个空格分开的小写字母,密码是由这个字母集中 的字母来构建的。 输出 输出若干行,每一个输出行包括一个长度为 L 个字符的密 码(没有空格)。输出行必须按照字母顺序排列。 如果计算出超过 25000 个有效密码,你的程序只需输出前 25000 个有效密码,即使后面还存在有效密码。
输入复制
4 6
a t c i s w
输出复制
acis
acit
aciw
acst
acsw
actw
aist
aisw
aitw
astw
cist
cisw
citw
istw
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
char a[110]={'\0'};
int b[110]={0};
char c[110]={'\0'};
int cnt=0;
int s;
int main()
{
int l;
cin>>l>>s;
for(int i=0;i<s;i++)
{
cin>>c[i];
}
sort(c+0,c+s);//把此数组按字典顺序重新排列
func(l,0);
return 0;
}
void func(int l,int k)
{
if(k>=l)
{
if(cnt<25000)
{
cnt++;
bool sss=false;
int cnt2=0;
for(int i=0;i<l;i++)
{
if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')sss=true;
else cnt2++;
if(a[i]>a[i+1]&&i+1<l)
{
sss=false;
break;
}
if(cnt2>=2&&sss==true)break;
}
if(sss==false||cnt2<2)return;
for(int i=0;i<k;i++)cout<<a[i];
cout<<endl;
}
return;
}
for(int i=0;i<s;i++)
{
if(b[i]==0)
{
a[k]=c[i];
b[i]=1;
func(l,k+1);
b[i]=0;
}
}
return;
}
三个三位数
题目描述: 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3的比例,试 求出所有满足条件的三个三位数。 例如:三个三位数192,384,576满足以上条件。 输入 无。 输出 每行三个三位数,为满足条件的一种方案。这三个三位数按从小到大的方式给出,相邻两个数之间 用单个空格隔开。 请按照第一个三位数从小到大的顺序依次输出每种方案
#include<bits/stdc++.h>
using namespace std;
void func(int,int);
int a[110]={1,2,3,4,5,6,7,8,9};
int b[110]={0};
bool c[110];
int main()
{
func(9,0);
return 0;
}
void func(int n,int k)
{
if(k>n-1)
{
int aaa=b[0]*100+b[1]*10+b[2];
int bbb=b[3]*100+b[4]*10+b[5];
int ccc=b[6]*100+b[7]*10+b[8];
if(aaa*2==bbb&&aaa*3==ccc)cout<<aaa<<" "<<bbb<<" "<<ccc<<endl;
return;
}
for(int i=1;i<=9;i++)
{
if(c[i]==0)
{
c[i]=1;
b[k]=i;
func(n,k+1);
c[i]=0;
}
}
}