HDOJ 1716 排列2(next_permutation函数)

Problem Description
Ray又对数字的列产生了兴趣:
现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。

Input
每组数据占一行,代表四张卡片上的数字(0<=数字<=9),如果四张卡片都是0,则输入结束。

Output
对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数,千位数字相同的在同一行,同一行中每个四位数间用空格分隔。
每组输出数据间空一行,最后一组数据后面没有空行。

Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0

Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321

1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211

1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210

1这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件 2下面是以前的笔记 与之完全相反的函数还有prev_permutation 3(1) int 类型的next_permutation 4int main() 5{ 6 int a[3]; 7a[0]=1;a[1]=2;a[2]=3; 8 do 9{ 10cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//输入a[0],a[1],a[2]; 11} while (next_permutation(a,a+3)); //参数3指的是要进行排列的长度 12//如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继 13} 14输出: 15 1 2 3 16 1 3 2 17 2 1 3 18 2 3 1 19 3 1 2 20 3 2 1 21如果改成 while(next_permutation(a,a+2)); 22则输出: 23 1 2 3 24 2 1 25只对前两个元素进行字典排序 26显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3 27若排列本来就是最大的了没有后继, 28则next_permutation执行后,会对排列进行字典升序排序,相当于循环 29 int list[3]={ 30 31 32 3,2,1}; 33next_permutation(list,list+3); 34cout<<list[0]<<" "<<list[1]<<" "<<list[2]<<endl; 35//输出: 1 2 3 36 37例题: 38Problem B 39 40Ray又对数字的列产生了兴趣: 41现有四张卡片,用这四张卡片能排列出很多不同的4位数, 42要求按从小到大的顺序输出这些4位数。 43 44Input 45每组数据占一行,代表四张卡片上的数字(0<=数字<=9), 46如果四张卡片都是0,则输入结束。 47 48Output 49对每组卡片按从小到大的顺序输出所有能由这四张卡片组成的4位数, 50千位数字相同的在同一行,同一行中每个四位数间用空格分隔。 51每组输出数据间空一行,最后一组数据后面没有空行。 52 53Sample Input 541 2 3 4 551 1 2 3 560 1 2 3 570 0 0 0 58 59Sample Output 601234 1243 1324 1342 1423 1432 612134 2143 2314 2341 2413 2431 623124 3142 3214 3241 3412 3421 634123 4132 4213 4231 4312 4321 64 651123 1132 1213 1231 1312 1321 662113 2131 2311 673112 3121 3211 68 691023 1032 1203 1230 1302 1320 702013 2031 2103 2130 2301 2310 713012 3021 3102 3120 3201 3210 72 73 74#include < iostream > 75#include < stdio.h > 76#include < algorithm> 77#include < string.h> 78using namespace std; 79 80int main() 81{ 82 int a[5],i,j,k,m=0; 83 while(~scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4])) 84 { 85 if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0) 86 return 0; 87 if(m) 88 printf("\n"); 89 m=1; 90 k=1;int h; 91 do 92 { 93 if(a[1]==0) 94 continue; 95 if(k==1) 96 { 97 printf("%d%d%d%d",a[1],a[2],a[3],a[4]); 98 k=0; 99 } 100 else 101 { 102 if(h==a[1]) 103 printf(" %d%d%d%d",a[1],a[2],a[3],a[4]); 104 else 105 printf("\n%d%d%d%d",a[1],a[2],a[3],a[4]); 106 } 107 h=a[1]; 108 } 109 while(next_permutation(a+1,a+5)); 110 printf("\n"); 111 } 112 return 0; 113} 114 115算法描述: 116 1171、从尾部开始往前寻找 两个相邻 的元素 118 1191个元素i,第2个元素j(从前往后数的),且i<j 120 1212、再从尾往前找第一个大于i的元素k。将i、k 对调 122 1233[j,last)范围的元素置逆( 颠倒排列 )

这个题目用递归也可以做:

1#include < stdio.h> 2#include < string.h> 3#include < stdlib.h> 4int a[6],vis[5],t,sol[5],last; 5void dfs(int c) 6{ 7 if(c==5) 8 { 9 if(sol[1]==0) 10 return; //千位是0的不符合 11 if(t!=0 && sol[1]==last) 12 printf(" "); //一行的最后一个数后面不能输出空格 13 if(t!=0 && sol[1]!=last) 14 { 15 printf("\n"); //千位不同则换行 16 } 17 last=sol[1]; //记录上一个的千位 18 int j=1; 19 for(j ; j < = 4 ; j++) 20 { 21 printf("%d",sol[j]); 22 } 23 t++; 24 } 25 int i; 26 for(i = 1 ; i <= 4 ; i++) 27 { 28 if(vis[i]==0) 29 { 30 vis[i]=1; 31 sol[c]=a[i]; 32 dfs(c+1); 33 vis[i]=0; 34 while(a[i]==a[i+1]) //关键: 去重复 35 i++; //因为题目的输入是从小到大(否则先排序),所以如果在一轮排列结束后 36 } //如果后一个将要被选的数与上一轮这个下标的数相同,则跳过 37 } //比如1 1 1 2,第一轮1 1 1 2,返回上一次dfs后sol[3]=2,sol[4]=1 38} //返回到c=2,此时a[2]==a[3]=1,若再选1则为1 1 1 2,跳过则为1 2 1 1 39int main() 40{ 41 int i,T=0; 42 while(scanf("%d%d%d%d",&a[1],&a[2],&a[3],&a[4])) 43 { 44 if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0) break; 45 if(T!=0) printf("\n"); 46 T=1; 47 memset(vis,0,sizeof(vis)); 48 t=0; 49 dfs(1); 50 printf("\n"); 51 } 52 return 0; 53}

本文同步分享在 博客“谙忆”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

python刷题-特殊的数字

问题描述  153是一个非常特殊的数,它等于它的每位数字的立方和,即153111555333。编程求所有满足这种条件的三位十进制数。输出格式  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。foriinrange(100,1000):astr(i)0bstr(i)1c

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.