19-擅长排列的小明
内存限制:64MB 时间限制:1000ms 特判: No
通过数:85 提交数:157 难度:4
题目描述:
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入描述:
第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)
输出描述:
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入:
2
3 1
4 2
样例输出:
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
#include<stdio.h>
int a[10], book[10], n, m; //全局变量 数组a是每次排序的数, 数组book 是每次排序用过的数
void dfs(int step)
{
int i;
if(step==m+1) //当到达第m+1时, 说明前面已经排好序
{
for(i=1; i<=m; i++) //输出一种排列
printf("%d", a[i]);
printf("\n");
return; //返回最近一次调用dfs函数的地方
}
for(i=1; i<=n; i++)
{
if(book[i]==0) //判断这个数是否被用过
{
a[step]=i; //开始放入这个数
book[i]=1; //表示这个数已经用过
dfs(step+1); //递归 调用自己
book[i]=0; // 在下次排列之前令所有的数都没被用过
}
}
return;
}
int main()
{
int number;
scanf("%d", &number);
while(number--)
{
scanf("%d %d", &n, &m);
dfs(1);
}
return 0;
}