求一个全排列遍历查询的算法

wdgphc 2024-01-30 16:10:18

我想写一个函数,参数是一个数组,里面有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。

 

 

...全文
239 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

算法思路为首先看是否有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("该排列无效")

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧