题目描述:
小杨申请了一个保密柜,但是他忘记了密码。只记得密码都是数字,而且所有数字都是不重复的。
请你根据他记住的数字范围和密码的最小数字数量,帮他算下有哪些可能的组合,规则如下:1、输出的组合都是从可选的数字范围中选取的,且不能重复;
2、输出的密码数字要按照从小到大的顺序排列,密码组合需要按照字母顺序,从小到大的顺序排序。
3、输出的每一个组合的数字的数量要大于等于密码最小数字数量;
4、如果可能的组合为空,则返回“None”
输入描述:
1、输入的第一行是可能的密码数字列表,数字间以半角逗号分隔 2、输入的第二行是密码最小数字数量
输出描述:
可能的密码组合,每种组合显示成一行,每个组合内部的数字以半角逗号分隔,从小到大的顺序排列。 输出的组合间需要按照字典序排序。 比如: 2,3,4放到2,4的前面
示例1???
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
2,3,4
2
输出
2,3
2,3,4
2,4
3,4
说明:最小密码数量是两个,可能有三种组合: 2,3 2,4 3,4
三个密码有一种: 2,3,4
# -*- coding: utf-8 -*-
'''
#coding: utf-8
Author: mgc
Date: 2023-12-17 12:44:53
LastEditors: Do not edit
LastEditTime: 2023-12-19 15:47:03
'''
# import os
# import sys
# import math
# import functools
# import collections
# 从输入中获取数字列表
nums = [int(x) for x in input().split(',')]
# 获取k的值
k = int(input())
# 对nums进行去重并排序
nums = sorted(list(set(nums)))
# 用于记录已访问过的结果
visited = {}
# 用于存储最终结果
res = []
def dfs(pos, cur):
global nums
global k
# 如果当前结果的长度达到了k,将其加入最终结果列表
if len(cur) >= k:
ans = ','.join(cur)
if visited.get(ans) is None:
res.append(ans)
visited[ans] = True
# 如果已经遍历到了nums的末尾,结束当前搜索
if pos >= len(nums):
return
# 将当前位置的数字加入结果中,继续搜索
cur.append(str(nums[pos]))
dfs(pos + 1, cur)
# 回溯,将当前位置的数字从结果中移除,继续搜索
cur.pop()
dfs(pos + 1, cur)
# 从位置0开始进行深度优先搜索
dfs(0, [])
# 输出结果
if len(res) == 0:
print('None')
else:
res = sorted(res)
print('\n'.join(res))