小动物搬家划分无冲突子集Python

个人学习记录贴
题目:某动物园搬家,要运走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)))
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值