33,007
社区成员
发帖
与我相关
我的任务
分享
我想写一个函数,参数是一个数组,里面有9个元素(固定是9个),现在我要对这9个元素进行全排列的遍历查询,一共有9!个排列组合方式。
现在,我要对某一个排列进行可行性查询,也就是按第一个,第二个,第三个。。。。的方式调用另一个函数 check()进行查询,如果到了某一个数n(n<9)返回了false,那么9!个里面凡是和这个排列前n个相同的,后面就不用查了。如果9个数都返回了true,函数直接返回true,其他的排列组合也都不需要进行了。
求算法实现。
比如,9个参数为 1,2,3,4,5,6,7,8,9
其中一个排列组合方式为 123456789,先测试1,ok ,测试2,ok,测试3,false。 那么后面456789就不测了,而且以123开头的其他排列组合也都跳过了。
其中一个排列组合方式为 356724918,先测试3,ok ,测试5。 那么后面6724918就不测了,而且以35开头的其他排列组合也都跳过了。
如果一个排列组合方式为 264781935,依次对这些数进行测试,发现全都ok,那么就直接返回true。
如果所有的排列都测过没有ok的,就返回false。
算法思路为首先看是否有9个数字,不是,不可行;再看是否有重复数字,存在,不可行;再看数字范围是否为自己选择的范围内,不是,不可行。其余则可行。这个思路通用于任意9个数字。
import random
# 假设我们有9个不同的数字列表
original_numbers = list(range(1, 10))
# 随机生成一个排列
random_permutation = random.sample(original_numbers, len(original_numbers))
def is_valid_permutation(numbers):
# 检查列表长度是否为9
if len(numbers) != 9:
return False
# 使用集合来检查是否有重复的数字
unique_numbers = set(numbers)
# 如果集合长度不等于9,说明有重复的数字。
if len(unique_numbers) != 9:
return False
# 检查所有数字是否都在1-9的范围内。如果不为连续数字,可以检查数字是否在数组内即可。
for num in numbers:
if num < 1 or num > 9:
return False
# 通过所有检查,这个排列是有效的
return True
# 验证随机排列的有效性
if is_valid_permutation(random_permutation):
print("该排列有效")
else:
print("该排列无效")
# 假设我们有9个不同的、非连续的数字列表
original_numbers = [3, 5, 7, 10, 12, 15, 17, 19, 21] # 这里仅作为示例,您可以替换为实际的9个不同数字
# 随机生成一个排列(这里假设你已经有了一个排列)
given_permutation = original_numbers.copy() # 示例中直接使用原列表,实际情况可能是其他排列方式得到的
def is_valid_permutation(numbers, reference_set):
# 检查列表长度是否与参考集合相同
if len(numbers) != len(reference_set):
return False
# 使用集合来检查是否有重复的数字,并同时检查所有元素是否都在参考集合内
unique_numbers = set(numbers)
# 如果集合长度不等于参考集合长度,说明有重复或者存在不在参考集合内的数字
if len(unique_numbers) != len(reference_set) or not unique_numbers.issubset(reference_set):
return False
# 通过所有检查,这个排列是有效的(对于给定的参考集合)
return True
# 验证排列的有效性
if is_valid_permutation(given_permutation, original_numbers):
print("该排列有效")
else:
print("该排列无效")