使用C语言怎么实现一个全排列算法模板?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>程序的主要思路是:强>
1。把第1个数换到最前面来(本来就在最前面),准备打印1 xx,再对后两个数2和3做全排列。
2。把第2个数换到最前面来,准备打印2 xx,再对后两个数1和3做全排列。
3。把第三个数换到最前面来,准备打印3 xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述基本情况怎么处理,你需要自己想。你的程序要具有通用性,如果改变了N和数组一的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。
<强>解题过程:强>
1。当N=1的时候,则直接打印数列即可。
2。当N=2的时候,设数组为[a, b]
,,,,,,,,,,,打印[0],一个[1](即a, b)
,,,,,,,,,,,交换[0],一个[1]里面的内容
,,,,,,,,,,,打印[0],一个[1],,(此时已变成了[b])
3。当N=3的时候,数组为(a, b, c)
3.1把放在一个[0]的位置(原本也是如此,[0]=[0]),打印b, c的全排列(即[1]、[2]的全排列)
3.2 b把放在一个[0]的位置(这时候需要交换原数组的[0]和[1]),然后打印,c的全排列,打印完后再换回原来的位置,即一个还是恢复到[0],b还恢复到一个[1]的位置
,,,,, 3.3把c放在一个[0]的位置(这时候需要交换的是原数组的[0]和[2]),然后打印a, b的全排列,打印完后再换回原来的位置,即一个还是恢复到[0],b还恢复到一个[1]的位置
至此,全排列完成
当N=4、5、6……的时候,以此类推。
# include & lt; stdio.h> ,/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//*,功能:实现两个整形参数值交换/*,参数:/*,,,,lh, int类型的指针,指向待交换数1的地址/*,,,,rhs——int类型的指针,指向待交换数2的地址/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */void 交换(int * lh, int * rhs) { ,int t =, *韩; , ,* lhs =, * rhs; ,* rhs =, t; } ,/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//*,功能:实现全排列功能/*,参数:/*,,,,来源——整数数组,存放需要全排列的元素/*,,,,begin ——查找一个排列的开始位置/*,,,,最终获得,——查找一个排列的结束位置,当开始=结束时,表明完成一个排列/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */void FullPermutation (int 源[],int 开始,int 结束) { ,int 我; , ,if (begin 祝辞=,结束),//,找到一个排列 ,{ ,for (小姐:=,0;,小姐:& lt;,,,我+ +) ,{ ,,printf (“% d",,来源[我]); ,} ,printf (“\ n"); ,} ,//还没有找完一个排列,则继续往下找下一个元素 ,{ ,for (小姐:=,开始,,小姐:& lt;,,,我+ +) ,{ if 才能;(begin !=,我) {才能 交换才能(和源[开始],和源[我]);,//,交换 ,,} ,//才能,递归排列剩余的+ 1从开始到结束的元素 FullPermutation才能(源,begin +, 1,); , if 才能;(begin !=,我) {才能 交换才能(和源[开始],和源[我]);,//,回溯时还原 ,,}, ,} ,} } , int main () { [30],int 来源; ,int 我,计数; , ,scanf (“% d",,,数量); , ,//初始化数组 ,for (小姐:=,0;,小姐:& lt;,计数;,我+ +) ,{ ,源[我]=,小姐:+,1; ,} , ,FullPermutation(源,,0,,数量); , ,return 0; }
看完上述内容,你们掌握使用C语言怎么实现一个全排列算法模板的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!