个人学习记录贴
题目:某动物园搬家,要运走N种动物,老虎与狮子放进一个笼子打架,大象与犀牛放一个笼子打架,野猪与猎狗放在一个笼子里打架…设计算法,使得装进同一个笼子的动物互相不打架。A={0,1,2,3,4,5,6,7,8}#代表N种动物的集合,R={(1,4),(4,8),(1,8),(1,7),(8,3),(1,0),(0,5),(1,5),(3,4),(5,6),(5,2),(6,2),(6,4)}#冲突关系集合
我们需要把不打架的动物们放在一起,计算出最少需要几个笼子.
代码:
s = [0,1,2,3,4,5,6,7,8,9]
c = []
# 冲突集合R
R = [[1,4],[4,8],[1,8],[1,7],[8,3],[1,0],[0,5],[1,5],[3,4],[5,6],[5,2],[6,2],[6,4]]
# 对冲突集合进行排序
for i in range(len(R)):
if R[i][0] > R[i][1]:
R[i][0],R[i][1] = R[i][1],R[i][0]
def bubble(data): # 冒泡排序
for j in range(len(data)-1,0,-1):
count = 0
for i in range(len(data)-1):
if data[i] > data[i+1]:
data[i],data[i+1] = data[i+1],data[i]
count += 1
if count == 0:
return
# 使用递归循环将冲突的小动物一一排除
def divide(s):
s_new = []
for i in range(len(s)-1):
for j in range(len(s)-1,i,-1):
if [s[i],s[j]] in R:
s.remove(j) # 冲突的动物踢出
s_new.append(j) # 踢出去的动物关进一个新的笼子
print('划分后:')
c.append(1) # 计算次数
print(s)
bubble(s_new)
print('下一次候选集')
print(s_new)
if len(s_new) <= 2:
print("已划分结束")
else:
divide(s_new) # 递归
divide(s)
print('划分次数为:{}'.format(len(c)))