您的位置:首页 > 其它

生成1~n的排列的三种方法

2016-11-11 21:22 274 查看
#include <cstdio>
#include <algorithm>

const int MAXN = 10;

bool used[MAXN + 1];
int n, a[MAXN + 1];

void search(int i)
{
if (i == n + 1)
{
for (int i = 1; i <= n; i++) printf("%d%c", a[i], i == n ? '\n' : ' ');
return;
}

for (int j = 1; j <= n; j++)
{
if (!used[j])
{
used[j] = true;
a[i] = j;
search(i + 1);
used[j] = false;
}
}
}

void print_permutation(int n, int *A, int cur)  //用*A传A数组
{
if (cur == n) //递归边界
{
for (int i = 0; i < n; i++) printf("%d ", A[i]);
printf("\n");
}
else for (int i = 1; i <= n; i++) //尝试在A[cur]中填各种整数i
{
int ok = 1;
for (int j = 0; j < cur; j++)
if (A[j] == i) ok = 0; //即i已经在A[0]~A[cur-1]中出现过
if (ok) //说明i没有在序列中出现过
{
A[cur] = i; //把它添加到序列末尾
print_permutation(n, A, cur + 1); //递归调用
}
}
}

int main()
{
scanf("%d", &n);

search(1);

static int a[MAXN + 1];
for (int i = 1; i <= n; i++) a[i] = i;

do
{
for (int i = 1; i <= n; i++) printf("%d%c", a[i], i == n ? '\n' : ' ');
}
while (std::next_permutation(a + 1, a + n + 1)); //如果循环完了就会返回一个false
//next_permutation传的参数和sort一样

}


这三种随便写一种就行

【代码其中之一来自紫书,其他的来自Menci,注释是我自己加的啦(:з」∠)】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: