user-0 提问: 大佬求解，1—9分成一组三个三位数，且每组中数字不得重复，输出所有可能

回复:
user: user-1
content: 所有可能有点多啊. 如果考虑顺序, 有 9! 大约36万种.

user: user-2
content: 递归理解起来也很简单，就是你自己跟着代码去看，然后自己画一个栈，每执行一次递归就入栈一次，每一次递归的完成就相当于出栈一次，这样结合起来看就比较容易了，系统也是用递归工作栈去完成递归的运算的

user: user-3
content: 可以参考我的一篇讲解全排列的帖子

user: user-4
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  void swap(char *a,char *b) { 	char temp; 	temp = *a; 	*a = *b; 	*b = temp;	 }  void  Allarrange(char *str,int k,int len) { 	int i; 	if(k==len) 	{ 		static int s_i=1; 		//printf("第%d种排列为:\t%s\n",s_i++,str);     //全排列输出 		printf("第%d种排列为:\t",s_i++);                     //针对本题目进行的修改输出 		printf("%c%c%c	",str[0],str[1],str[2]); 		printf("%c%c%c	",str[3],str[4],str[5]); 		printf("%c%c%c\n",str[6],str[7],str[8]); 	} 	else 	{ 		for(i=k;i<=len;i++) 		{ 			swap(str+i,str+k); 			Allarrange(str,k+1,len); 			swap(str+i,str+k); 		} 	} } int main() { 	char str[10]={'1','2','3','4','5','6','7','8','9'}; 	Allarrange(str,0,strlen(str)-1); 	return 0; } 下图是运行结果，一共是9！次，也就是362 880组，每组里面有三个3位数。

user: user-5
content: 看不懂啊啊啊啊啊啊啊啊啊啊啊啊啊

user: user-6
content: 远离高数很多年

user: user-7
content: 这其实就是个全排列的程序。（注意一下，全排列这东西，在小规模数据枚举法的圈圈儿里，还是有一定的出镜率的。） 它的作用就是输出一组数据（比如123456789）的所有排列可能。我最喜欢的写法是这样的，兄弟理解下： //****************************************************************************** // 全排列程序 //******************************************************************************  #define N 3  #include <stdio.h>  int d[N];  // 输出一下 void write() { 	int i; 	for(i=0; i<N; i++) 		printf("%d ", d[i]); 	printf("\n"); }  // 交换d[i]和d[j] void swap(int i, int j) { 	int t; 	t=d[i]; 	d[i]=d[j]; 	d[j]=t; }  // 它的作用是“得到d[k]~d[N-1]范围内的所有排列形式” int f(int k) { 	int i; 	if(k==N-1) // 只剩一个数了，没啥好排列的，输出即可 		write(); 	else 		for(i=k; i<N; i++) // d[k]~d[N-1]范围内，每个数都能当第一个 		{ 			swap(k, i); // 换到第一个 			f(k+1); // 剩下的递归运行 			swap(k, i); // 换回来 		} }  //****************************************************************************** // 主函数 //****************************************************************************** int main(int argc, char *argv[]) { 	int i; 	for(i=0; i<N; i++) 		d[i]=i+1; 	f(0); 	return 0; }

user: user-0
content: 引用 4 楼 褐雨燕的回复:这其实就是个全排列的程序。（注意一下，全排列这东西，在小规模数据枚举法的圈圈儿里，还是有一定的出镜率的。） 它的作用就是输出一组数据（比如123456789）的所有排列可能。我最喜欢的写法是这样的，兄弟理解下： //****************************************************************************** // 全排列程序 //******************************************************************************  #define N 3  #include <stdio.h>  int d[N];  // 输出一下 void write() { 	int i; 	for(i=0; i<N; i++) 		printf("%d ", d[i]); 	printf("\n"); }  // 交换d[i]和d[j] void swap(int i, int j) { 	int t; 	t=d[i]; 	d[i]=d[j]; 	d[j]=t; }  // 它的作用是“得到d[k]~d[N-1]范围内的所有排列形式” int f(int k) { 	int i; 	if(k==N-1) // 只剩一个数了，没啥好排列的，输出即可 		write(); 	else 		for(i=k; i<N; i++) // d[k]~d[N-1]范围内，每个数都能当第一个 		{ 			swap(k, i); // 换到第一个 			f(k+1); // 剩下的递归运行 			swap(k, i); // 换回来 		} }  //****************************************************************************** // 主函数 //****************************************************************************** int main(int argc, char *argv[]) { 	int i; 	for(i=0; i<N; i++) 		d[i]=i+1; 	f(0); 	return 0; } 这个递归理解需要什么基础吗，这两天一直在看 像这种两个函数中间夹个递归函数的怎么运行的都没搞明白，汉诺塔那个也是，不过简单像fib数列倒是明白

user: user-8
content: STL里面不是有一个全排列函数吗

user: user-9
content: 引用 2 楼 m0_46218308 的回复:算，那个全排列能解释下吗 学过数学的排列组合吗？没学过可以在网上搜索资料先学习理解 9个数子的全排列如下，就是每个位置放不同的数字就是一种排列 123456789 123456798 123456879 ... 132456789 132456798 132456879 ... ... 912345678 912345687 912345768 ... ... 987654321  找出9个数组的所有排列后，3个3个分段即可

user: user-0
content: 引用 1 楼 user-9的回复:比如123和321算不算一组的相同情况？ 如果不算，可以1-9九个数字做全排列，然后前三个一组，中间三个一组，后三个一组，即可 如果算，那就在上面的基础上去掉重复的数据 算，那个全排列能解释下吗

user: user-9
content: 比如123和321算不算一组的相同情况？ 如果不算，可以1-9九个数字做全排列，然后前三个一组，中间三个一组，后三个一组，即可 如果算，那就在上面的基础上去掉重复的数据