擅长排列的小明
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
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
其实这个问题那。。主要是在对于d[]这个数组的处理上。。其他的递归限制条件啊。。而且在变量的定义上也可采用全局变量。。防止递归传参出错!!!思路什么的跟全排列很像, 主要是要理解回溯的思想!!望大神们。。多提意见。。
#include<stdio.h> #include<stdlib.h> #include<string.h> int j; void paixu(int d[], int c[], int b, int size){ int i; if(j == size) { for(i = 0; i<size; i++) printf("%d", d[i]); printf("\n"); } else for(i = 0; i<b; i++){ if(c[i] == 0){ d[j++] = i+1; c[i] = 1; paixu(d, c, b, size); j--; c[i] = 0; } } } int main(){ int n, m, i, size; int *d, *c; scanf("%d", &m); for(i = 0; i<m; i++){ scanf("%d", &n); scanf("%d", &size); d = (int *)malloc(sizeof(int)*n); memset(d, 0, sizeof(int)*n); c = (int *)malloc(sizeof(int)*n); memset(c, 0, sizeof(int)*n); paixu(d, c, n, size); } return 0; }
-
第一行输入整数N(1<N<10)表示多少组测试数据,