每天一个小程序(17)——全排列递归实现

来源:互联网 发布:cpa广告联盟源码 编辑:程序博客网 时间:2024/04/28 16:32

本程序参考STL系列之十 全排列(百度迅雷笔试题)


全排列的思想是从第一个数字起的每个数字分别于后边的数字进行交换。


//用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, //如 abc 的全排列: abc, acb, bca, dac, cab, cba#include <stdio.h>#include <string.h>void Swap(char *a,char *b){char t = *a;*a = *b;*b = t;}bool IsSwap(char *str, int begin, int end){for(int i = begin; i < end; i++)if(str[i] == str[end])return false;return true;}void AllRange(char *str, int k, int m){if(k == m){static int s_i = 1;printf("第%-3d个排列  %s  \n", s_i++,str);}else{for(int i = k; i <= m; i++){if(IsSwap(str,k,i)){Swap(str + k, str + i);AllRange(str, k + 1, m);Swap(str + k, str + i);}}}}void Foo(char *str){AllRange(str, 0, strlen(str) - 1);}void main(){char str[] = "12345";Foo(str);}



这个递归的方法是在调用AllRange函数前,交换一对数字,使得每一个数都有机会与后边的每一个数进行分别交换,这样就可以达到全排列的目的了。AllRange函数前调用Swap函数是为了交换一对数,AllRange函数之后调用Swap函数是将这个序列恢复,保证这个序列的正确输出。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 oppor9手机听筒声音小怎么办 苹果7摔弯了屏幕怎么办 苹果手机压弯了怎么办 京东买的电脑坏了怎么办 拼多多低价乱价怎么办 厂家不通过经销商直接发货怎么办 媳妇吵架说我全家有病怎么办 全家都不尊重媳妇怎么办 招商闪电贷有额度不通过怎么办 闪电贷页面登录不进去怎么办 91借钱极速逾期怎么办 论文没过拿不到毕业证怎么办 大学论文不过拿不到毕业证怎么办 转店被黑中介骗了钱怎么办? 被星外转铺骗了怎么办 店铺转了后悔了怎么办 商铺转让不出去怎么办? 和包券密码丢失怎么办 天猫购物卷兑换不了怎么办 淘宝新店每天只有几个访客怎么办 注册淘宝企业店铺需要审核怎么办 淘宝店铺被投诉知识产权怎么办 一般违规扣48分怎么办 金税盘处于报税期不能开票怎么办 小规模税率开错了怎么办 我是代购卖家被买家投诉偷税怎么办 天猫盒子内存不够怎么办 天猫品牌申请不通过怎么办 天猫商家发货发个空包裹怎么办 无限流量怎么办没有4g 海外直邮身份证过期了怎么办 买车的人不过户怎么办 天猫精灵球泡离线怎么办 花呗被骗了2万怎么办 天猫公司变更地址发票怎么办 支付宝自助解限怎么办 支付宝16岁限额怎么办 支付宝提不了现怎么办 支付宝余额受限需要身份证怎么办 微信被骗了6000怎么办 被代运营骗了该怎么办