原题链接:蓝桥杯算法提高VIP-阮小二买彩票
解题思路:
一楼已经有了很简单的题解,这里发一些递归的思路。
递归思路。可以看成一棵树进行递归。
以3121举例来说。
递归遍历出所有结果。当然结果中有很多不符合条件的数,比如说3111,因此我们需要对递归后的结果进行筛选,把符合条件的筛选出来,进行输出即可。
下面代码中有注释。
注意事项:
参考代码:
def f(temp,count): #temp为组合排列数,count为temp的位数 global n global m global snum global cho if count == n: temp_num = [temp[i] for i in range(n)] temp_set = set(temp_num) #以下四行判断组合排列数的不重复数字数是否等于输入 for i in temp_set: if snum.count(i) != temp_num.count(i): return if temp not in cho: cho.append(temp) return for i in range(n): temp = temp + snum[i] f(temp,count+1) temp = temp[:-1] if __name__ == '__main__': s = input().strip() #此处不加strip()会91分报错 n = len(s) snum = [s[i] for i in range(n)] m = len(set(snum)) #判断输入的整数一共有多少个不重复的数字 cho = [] #最后筛选出的全排列的集合 temp = '' f(temp,0) cho.sort() for item in cho: print(item)
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复