The univer|

Momo·Trace

园龄:3年3个月粉丝:6关注:1

求排列(全排列问题)

求排列

设有n个整数的集合{1,2,…,n}(n<13),从中取出任意r个数进行排列(r<n),试列出所有的排列。

输入

n,r

输出

以由小到大的字典序输出n(1<=n<=9)

样例输入

3 3

样例输出

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

(这题知道dfs模板就会呀。。。)

代码:

#include <bits/stdc++.h>
using namespace std;
int n,r;
int a[101];
bool v[101];
void dfs(int k)
{
if(k==r+1)
{
for(int i=1;i<=r;i++)
{
cout << a[i] << ' ';
}
cout << "\n";
return;
}
for(int i=1;i<=n;i++)
{
if(v[i]==false)
{
a[k]=i;
v[i]=true;
dfs(k+1);
v[i]=false;
}
}
}
int main()
{
cin >> n >> r;
dfs(1);
return 0;
}

那么 (咳咳

延伸一道题吧

全排列问题

输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入

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>
using namespace std;
int a[101],n;
bool v[21];
void dfs(int k)
{
if(k == n+1)
{
for(int i=1;i<=n;i++)
{
cout << a[i] << " ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
{
if(v[i]==false)
{
a[k] = i;
v[i] = true;
dfs(k+1);
v[i] = 0;
}
}
}
int main()
{
cin>>n;
dfs(1);
}
posted @   Momo·Trace  阅读(84)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起