原题链接:蓝桥杯算法提高VIP-阮小二买彩票
(想偷懒看了一眼题解,全都是next_permutation属于是和题目要求的完全不一样了,于是就自己写了一篇)
为什么有些题解用的是c++的next_permutation要说代码是c的。
解题思路:
用回溯得到排列结果,用标记去重复
注意事项:
如果想用c提交就把bool换成char;sort换成自己写的排序;6!=720,即全排列最多720种(数组范围确定);
参考代码:
#include<stdio.h> #include<string.h> #include<algorithm>//提供快排的c++头文件 char a[12],out[725][7]; bool mark[12],overlap[725]; int len,cnt; void range(int num) { if(num>=len) { cnt++; strcpy(out[cnt],out[cnt-1]); return; } for(int i=0;i<len;i++)if(!mark[i])out[cnt][num]=a[i],mark[i]=1,range(num+1),mark[i]=0; } void elimination(int num) { for(int i=0;i<cnt-1;i++)for(int j=i+1;j<cnt;j++)if(strcmp(out[i],out[j])==0)overlap[j]=1; } main() { scanf("%s",a); len=strlen(a); std::sort(a,a+len);//快排//什么排序都可以,不过我比较懒 range(0);//回溯求排列 elimination(0);//标记重复的 for(int i=0;i<cnt;i++)if(!overlap[i])printf("%s\n",out[i]); }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复