"""
# @time : 2020/11/25
# @author : jimou chen
"""from math import sqrt
n = int(input())
num = [0 for _ in range(n + 1)]
flag = [0 for _ in range(n + 1)]
# 判斷素數
def prime(x):
for i in range(2, int(sqrt(x)) + 1):
if x % i == 0:
return 0
return 1
# x 是當前的數,v是滿足條件的前乙個數
def dfs(x, v):
if x == n + 1:
# 判斷最後乙個數和第乙個數之和
if prime(v + 1):
for i in range(1, n + 1):
print(num[i], end=' ')
print()
return # return的位置是和for同一級的
for i in range(1, n + 1):
if flag[i] == 0 and prime(i + v):
flag[i] = 1
num[x] = i
dfs(x + 1, i)
flag[i] = 0
num[1] = 1
flag[1] = 1
dfs(2, 1)
'''6
1 4 3 2 5 6
1 6 5 2 3 4
81 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
'''
'''
優化的話,可以使用素數表,這樣就不用每次都遍歷判斷了
'''k = 0
# 素數表,1表示素數
def prime_table(x):
global k
l = [1 for _ in range(x + 1)]
for i in range(2, x + 1):
for k in range(2, int(sqrt(i)) + 1):
if i % k == 0:
l[i] = 0
return l
prime = prime_table(n+100)
from math import sqrt
def isprime(num):
for i in range(2, int(sqrt(num)) + 1):
if num % i == 0:
return 0
return 1
def isprimecircle(box):
if box[0] != 1:
return 0
for i in range(len(box) - 1):
if isprime(box[i] + box[i+1]) == 0:
box.pop()
return 0
box.pop()
return 1
def backtrack(nums, box):
if (len(box) == len(nums)) and (isprimecircle(box) == 1):
print(box)
return
for i in nums:
if i in box:
continue
backtrack(nums, box)
box.pop()
while true:
try:
n = int(input())
b =
test = [_ + 1 for _ in range(n)]
backtrack(test, b)
except:
break
python回溯演算法全排列 回溯演算法 全排列
1 問題描述 對於給定的集合 a,其中的 n 個元素互不相同,如何輸出這 n 個元素的所有排列 全排列 時間複雜度為o 2n 例如 全排列 2 回溯演算法思想 這裡以 a 為例,來說明全排列的生成方法,對於這個集合,其包含 3 個元素,所有的排列情況有 3 6 種,對於每一種排列,其第乙個元素有 3...
素數環 回溯演算法
設計 這個素數環有20個位置,每個位置可以填寫1 20的整數,可以對每個位置從1搜尋 約束條件 1 與前面已經填寫的數不重複 2 與前乙個數的和為素數 3 最後乙個數與第乙個數的和為素數 在填寫第k個位置時,如果滿足約束條件,則繼續填寫k 1個位置 如果1 20都不滿足,就回溯到k 1個位置,從原來...
回溯演算法 全排列
1 問題描述 對於給定的集合 a,其中的 n 個元素互不相同,如何輸出這 n 個元素的所有排列 全排列 時間複雜度為o 2n 例如 全排列 2 回溯演算法思想 這裡以 a 為例,來說明全排列的生成方法,對於這個集合,其包含 3 個元素,所有的排列情況有 3 6 種,對於每一種排列,其第乙個元素有 3...