python分支限界剪枝思想小練習

2021-09-19 06:52:38 字數 1795 閱讀 4989

題目:兩個桌球隊進行比賽,各出三人。甲隊為1, 2, 3三人,乙隊為4, 5, 6

三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。

1說他不和4比,3說他不和4, 6比,請程式設計序找出三隊賽手的名單。

思路:類似於分支限界的剪枝法,窮舉回溯

a,b,c代表甲隊的1,2,3

d,e,f代表最後符合篩選條件的,分別對應於1,2,3的對手

a=1

b=2c=3

d=4e=5

f=6for i in range(1,4):

for j in range(4,7):

if (i == 1 and j == 4):

continue

if ((i == 3 and j == 4) or (i == 3 and j == 6)):

continue

for k in range(4,7):

if(k==j):

continue

if(i==1):

d=je=k

f=15-j-k

if (i == 2):

e = j

f = k

d = 15 - j - k

if (i == 3):

f = j

d = k

e = 15 - j - k

if(not(a==1 and d==4) and (c==3 and d==4) and (c==3 and f==6)):

d=je=k

f=15-j-k

break

print('%d的對手為:%d'%(a,d))

print('%d的對手為:%d'%(b,e))

print('%d的對手為:%d'%(c,f))

#執行結果

# 1的對手為:6

# 2的對手為:4

# 3的對手為:5

法二

a,b,c代表甲隊的1,2,3

d,e,f代表最後符合篩選條件的,分別對應於1,2,3的對手

思路:隨機變換d,e,f對應的4,5,6的對應關係

直到出現符合跳出迴圈條件的結果出現

a=1

b=2c=3

d=4e=5

f=6i=0

while((a==1 and d==4) or (c==3 and f==4) or (c==3 and f==6)):

# while (not ((a==1 and d==6) and (b==2 and e==4) and (c==3 and f==5))):

i=i+1

#if這幾個交換位置怎樣換都可以,但必須保證三種交換可能都必須出現一次

#即例如:第乙個是d和e交換,第二個是e和f交換,第三個必須是d和f交換

#想降低時間複雜度可以考慮交換順序與賦予初值之間的配合

if(i%2):

temp=f

f=ee=temp

if(i%3):

temp = d

d = f

f = temp

else:

temp = d

d = e

e = temp

print('%d的對手為:%d'%(a,d))

print('%d的對手為:%d'%(b,e))

print('%d的對手為:%d'%(c,f))

#執行結果

# 1的對手為:6

# 2的對手為:4

# 3的對手為:5

方法粗糙,但易於理解,有誤望指正

Python之列表 元組小練

修改列表,列表屬於可變物件,值是可以改變的,字串屬於不可變物件,不能修改其中的值 list1 0 98 print list1 str1 ahdh str1 0 q print str1 list3 2 0 33 如果需要修改子列表中的值,多用一次下標 print list3 列表中的切片 prin...

Python之檔案讀寫小練

file1 open c test note1.txt 注意可能有轉義符的情況 file1 open c test note1.txt 可以多加乙個 讓特殊含義不生效 file1 open c test note1.txt 可以用 替換成 效果是一樣的 file1 open r c test not...

Python之字串小練

字串 a 3 數字 b 1234 字串可以用單引號表示 c 1 字串也可以用雙引號表示 引導既可以用單引號也可以用雙引號,但是要前後一致 print 列印括號內的內容到控制台 print it s ok.當句子中有單引號時,可以用雙引號,避免語法錯誤 print he said are you ok...