nyoj 19 擅长排列的小明

来源:互联网 发布:网络机顶盒不能点播 编辑:程序博客网 时间:2024/05/21 09:01

擅长排列的小明

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入
第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)
输出
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入
23 14 2
样例输出
123121314212324313234414243
其实这个问题那。。主要是在对于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");}elsefor(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;}                
原创粉丝点击