C语言:全排列的算法和代码(第九届蓝桥杯C组第三题)

题目:
对于某个串,比如:“1234”,求它的所有全排列。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342

分析:
根据此题目要求,我们可以知道编写程序时应该按照全排列算法中的字典序法进行思考。字典序法: 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。 [例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321。但交换两个数字的的位置后,我们必须含要把其换回来,不难理解为何交换回来,如果我们把1和3交换了,不交换回来的话,下一次交换就是3,4交换了,而我们是需要下一次交换1和4的。
然而此题主要还是在递归的思考上

程序代码如下:

#include<stdio.h>
void permu(char*data, int cur)
{
	int i,j;
	
	if(data[cur]=='\0')                                        
                {
		printf("%s\n",data);
		return;
	}                                                           //如果data[cur]不是‘/0’,则输出字符串date.
	
	for(i=cur; data[i]; i++){
		char tmp = data[i]; 
		for(j=i-1; j>=cur; j--) data[j+1] = data[j];
		data[cur] = tmp;			
        //这三行代码是交换两个数的位置
        
		permu(data, cur+1);	
		//在调用递归时,递归的里面还有循环,循环的里面还有递归		

		tmp = data[cur]; 
	    for(int j = cur;j < i;j ++) data[j] = data[j + 1];  //填空
		data[i] = tmp;
		//这三行代码是把前面交换的数再交换回来			
	}
}

int main()
{
	char a[] = "1234";
	permu(a,0);
	return 0;
}
发布了27 篇原创文章 · 获赞 31 · 访问量 2642

猜你喜欢

转载自blog.csdn.net/weixin_46102597/article/details/104119272
今日推荐