python排列组合,c++ 全排列函数
C STL中的全排列函数C STL中的全排列函数为两个:下一个_排列和前一个置换
其中:下一个_排列实现升序,而前一个置换实现降序
下面以123的全排列为例:
# includecstdio # includeiostream # includealgorithmusing命名空间stdint main(){ int s[3]={1,2,3 };/**下面为下一个置换的用法*/do { printf(%d %d %d\n ,s[0],s[1],s[2]);} while(next_permutation(s,S3));/**下面为前一个置换的用法*//*do { printf(%d %d %d\n ,s[0],s[1],s[2]);} while(prev_permutation(s,S3));*/返回0;}当然这只是原始定义的用法,我们可以自定义函数实现我们所需要的顺序
下面有两道例题:
第一题:
现在我们的英雄找到了魔王之门。他打开门,发现风5166要杀死我们美丽的公主。但是现在魔王必须先打败我们的英雄。风5166说:"我有三个问题要问你,如果你能回答出来,我就放了公主,否则你也是我的晚餐。"伊格内修斯自信地说:"好吧,最后,我会救公主的。"
"现在我给你看第一个问题“冯5166说:"给定一个数为一到普通的序列,我们定义1,2,3…N-1,N是所有可由数一到普通组成的序列中最小的一个序列(在这个问题中每个数只能使用一次)。所以很容易看出第二小的序列是一,二,三…N,N-1 .现在我给你两个数字,N和m .你应该告诉我由数字一到普通组成的第m个最小序列。这很简单,不是吗?哈哈哈哈哈……"
你能帮助伊格内修斯解决这个问题吗?
输入包含几个测试用例。每个测试用例包含两个数字,N和M(1=N=1000,1=M=10000).你可以假设总有一个序列满足魔王的需求。输入在文件结束时终止。
对于每个测试用例,你只需要输出满足魔王要求的序列。当输出一个序列时,应该在两个数字之间打印一个空格,但不要在最后一个数字之后输出任何空格。
样本输入6 4
11 8
样本输出1 2 3 5 6 4
1 2 3 4 5 6 7 9 8 11 10
题解:这道题看懂题目后就知道只需要进行全排列,输出第m小的序列即可
这道题只需要用到原始定义的升序排列即可注意小陷阱:"不要在最后一个数字后输出任何空格。"
英亩代码如下:
#includecstdio //别用万能头文件#includebits/stdc .h,交了你就知道了,哈哈哈# include算法# includeiostreamusing命名空间stdint main(){ int n,m;while(scanf(%d%d ,n,m)!=EOF){ int a[1005];for(int I=0;在;I)a[I]=I ^ 1;int num=0;do { numif(num==m){ int flag=0;for(int I=0;在;i ) { if(flag==0) { printf(%d ,a[I]);flag=1;} else printf( %d ,a[I]);} printf( \ n );打破;} } while(next_permutation(a,a n));}返回0;}第二题:
变位词(POJ 1256年)描述你要写一个程序,从一组给定的字母中产生所有可能的单词。
例子:给定单词“abc”,你的程序应该-通过探索这三个字母的所有不同组合-输出单词“abc”、“acb”、“bac”、“bca”、“cab”和cba .
在从输入文件中取出的单词中,一些字母可能出现不止一次。对于一个给定的单词,你的程序不应该产生相同的单词超过一次,单词应该按照字母升序输出。
输入输入由几个单词组成。第一行包含一个数字,给出后面的单词数。下面每一行包含一个单词。一个单词由从A到z的大写或小写字母组成。大写和小写字母被认为是不同的。每个单词的长度小于13。
对于输入中的每个单词,输出应该包含可以用给定单词的字母生成的所有不同的单词。从同一输入单词生成的单词应该以字母升序输出。大写字母在相应的小写字母之前。
样本输入3
飞机失事管理局
字母表
安徽城市篮球联赛
样本输出飞机失事管理局
阿伯
飞机失事管理局
阿伯
羊叫声
羊叫声
字母表
自动对比度平衡
二进制-模拟转换(二进制模拟转换器的缩写)
喹啉甲酸
驾驶室
中国篮球协会
栩栩如生
异体脱抗原松质骨
列线图
英联副产品及添加剂
抗心磷脂抗体
安徽城市篮球联赛
农业和农业合作社银行
巴卡
支链氨基酸
博茨瓦纳民航局
卡巴(菲律宾的一种容量单位)
中国天使投资协会
提示大写字母在相应的小写字母之前。
所以字母的正确顺序是AaBb…Zz .
题解:这题就要用到自定义的函数实现字母大写排在小写前面的功能
代码如下:
# include cstdio # include ostream # include算法# includecstring使用命名空间stdint cmp(char a,char b) //自定义函数{ if(tolower(a)!=tolower(b)) //tolower是将大写转化为小写返回到lower(a)到lower(b);否则返回ab;} int main(){ int n;scanf(%d ,n);char s[20];while(n - ) { scanf(%s ,s);int len=strlen(s);sort(s,s len,CMP);do { printf(%s\n ,s);} while(next_permutation(s,s len,CMP));//自定义函数的使用}返回0;} 仅供自己复习所用,如有错误还望指出
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。