Description
把 1至n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。
输入格式
一个整数n。(1<=n<=9)
输出格式
按照从小到大的顺序输出所有方案,每行一个方案。 同一行相邻两个数用一个空格隔开。 对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。
输入样例
3
输出样例
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
思路
题意:有n个数,将其随意排列,然后按照前面数字的大小进行输出。
首先,先设定一个标记数组v。符合条件进入if判断语句之后,将v标记为1,接着进行递归,下一个数进来,直到d>n(边界),输出n个值。
一个if判断语句可以输出一种情况,然后for循环可以找到所有的可能性。
for(i=1;i<=n;i++) { if(v[i]==0) { v[i]=1; a[d]=i; rec(d+1); v[i]=0; } }
还有一个for循环用来判断是否到达边界并且输出。
for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n");
#include<stdio.h>
int a[15];
int v[15];
int n;
void rec(int d)
{
int i;
if(d>n)
{
for(i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
for(i=1;i<=n;i++)
{
if(v[i]==0)
{
v[i]=1;
a[d]=i;
rec(d+1);
v[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
rec(1);
return 0;
}