[C语言入门题]1~n全排列

题目描述

大家高中都学过全排列。例如,1,2,3三个数进行全排列,其结果为(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1)。现在,给你数字n,请你列出数1,2,3...,n的全排列。输出顺序应该按照字典序输出。即对于两个排列,先比较第一位,第一位小的排前面,如果相等,再比较第二位,以此类推。例:(1,2,3)排在(1,3,2)前面。

输入

每一行输入一个数n。n<=5.

输出

每行输出对应的全排列情况。

样例输入

2
3

样例输出

(1, 2)(2, 1)
(1, 2, 3)(1, 3, 2)(2, 1, 3)(2, 3, 1)(3, 1, 2)(3, 2, 1)

提示

学着使用递归。


可以考虑将排序结果存储在数组A中。


首先,为了确定A中的数,你可以先确定A[0]。


A[0]可以有1~n种可能。


当A[0]取某一个值之后,接下来确定A[1]到A[n-1]的值(注意递归思想在这里体现)。


而为了确定A[1]的值,你需要回头去看一下A[0],如果某个数被A[0]用了,则A[1]不能再使用,而其他数都可以被A[1]使用。


一般地,当你确定A[k]时,你需要看看哪些数没有被A[0], A[1], ..., A[k-1]用过。没用过的数,都可以在A[k]中使用。


#include<stdio.h>
int Set[15];
int Arr[15];
int n;
void Arrange(int cur)
{
if (cur == n + 1)
{
printf("(");
for (int i = 1; i < cur; i++)
{
printf("%d", Arr[i]);
if (i != cur - 1)
printf(", ");
}
printf(")");
return;
}
for (int i = 1; i <= n; i++)
{
int ok = 1;
for (int j = 1; j<cur; j++)
if (Arr[j] == Set[i])
ok = 0;
if (ok)
{
Arr[cur] = Set[i];
Arrange(cur + 1);
}
}
}
int main()
{
while (scanf("%d", &n) != EOF)//元素个数
{
int i;
for (int i = 1; i <= n; i++)//元素
Set[i] = i;
Arrange(1);
printf("\n");
for (i = 1; i <= n; i++)
{
Set[i] = 0;
Arr[i] = 0;
}
getchar();
getchar();
}
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36039136/article/details/78762804