排列,全排列,组合,部分排列,有重复元素的排列问题
(2018-10-11 20:39:50)分类: 深搜和回溯 |
一)ss2365:全排列问题
题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。(注意输出格式(p老师的恶意))
输入 n(1<=n<=9)
输出 由1~n组成的所有不重复的数字序列,每一行一个序列,每个数字前4个空格。
样例输入 3
样例输出
1
2 3
1
3 2
2
1 3
2
3 1
3
1 2
3
2 1
#include "bits/stdc++.h"
这是全排列的題解。这里所要全排列的是数字i。不过,除了示例以外,真正做題时,不会出i。把这个i理解成,某种数组组合的下标i,通用性就广了。stl::next_permutation就是针对这样的用途。
using namespace std;
int main()
{
char
str[7];
cin>>str;
int
len=strlen(str);
do{
for(int
i=0;i
cout<<str[i];
cout<<endl;
}while(next_permutation(str,str+len));
return
0;
}
1)P127.5.1.7也是全排列完成程序,(交换完成回溯);
2)P133.5.2.3也是全排列,但主要考察,根据伪代码,修正得出可行的程序;
二)coj1032/ss2362:组合的输出
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解位自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有组合。
例如 n=5,r=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
输入 一行两个自然数n、r(1<=r<=n)。
输出
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。
样例输入 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;
int a[101]={1};//注意这里,与课本例題不一样,但效果一样
bool p[101];
int n,r,cnt;
void dfs(int k){
if(k>=r+1){
for(int i=1;i<=r;i++) cout<<a[i]<<" ";
cout<<endl;
cnt++;
}else
for(int i=a[k-1];i<=n;i++)//
if(p[i]){//
p[i]=false;//
a[k]=i;//
dfs(k+1);
题目描述
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。(注意输出格式(p老师的恶意))
输入 n(1<=n<=9)
输出 由1~n组成的所有不重复的数字序列,每一行一个序列,每个数字前4个空格。
样例输入 3
样例输出
#include "bits/stdc++.h"
using
namespace
std;
int
a[101],b[101];
bool
p[101]={0};
int
x[101];
int
n,cnt=0;
void
print(){………省略………
}void
dfs(
int
k){
for
(
int
i=1;i<=n;i++)
if
(! p[i]){
p[i]
=
true
;
a[k]
=i;
if
(k==n)
print();
else
dfs(k+1);
p[i]
=
false
;
}
}
int
main(){
cin>>n;
dfs(1);
return
0;}
using namespace std;
int main()
{
}
1)P127.5.1.7也是全排列完成程序,(交换完成回溯);
2)P133.5.2.3也是全排列,但主要考察,根据伪代码,修正得出可行的程序;
二)coj1032/ss2362:组合的输出
排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解位自然数1,2,…,n,从中任取r个数。
现要求你用递归的方法输出所有组合。
例如 n=5,r=3,所有组合为:
1 2 3
输入
输出
所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。
样例输入 5 3
样例输出
#include "bits/stdc++.h"
using namespace std;
int a[101]={1};//注意这里,与课本例題不一样,但效果一样
bool p[101];
int n,r,cnt;
void dfs(int k){