按规律摆放红蓝花盆(python)实现

'''
有三个花盆,红色,蓝色,黄色各n个。开始时排列的顺序是混乱的,如:黄,红,蓝,黄,黄,蓝,黄,红,红,黄,蓝,红,黄,红,黄,蓝,蓝,红,红,红,黄,蓝,蓝,黄,黄,黄,红,红,蓝,蓝,蓝
请编写程序:将各个花盆按红,黄,蓝,红,黄,蓝....的顺序排列,而且要求花盆的交换次数最少。
问题分析:
    本题是按约排序问题,目标是将红花盆送到3i-2的元素,将黄花盆送到与号为3i-1的元素,将蓝花盆送到序号为3i(i=1,2,...,n)的元素。并要求花盆的移动次数最少
    1:红
    2:黄
    3:蓝
    使用中间变量法交换A,B的值(D=A,A=B,B=D),若三个变量A,B,C,做循环式交换,则可是一成D=A,A=B,B=C,C=D。因此,若认为一次交换两个花盆的运算为3,那么3花盆做循环式交换运算为4,。
    为了满足题意:
    1、原序号为3i-2的红花盆,3i-1的黄花盆,3i的蓝花盆保持原位置不变。
    2、应该尽量进行两个换盆之间的直接交换,如:应放红花盆处的黄花盆,应尽量与放黄花盆的红花盆直接交换。
    3、最后才将进行必要的3花盆做循环式交换工作,如:将红花盆处放的黄花盆,黄花盆处放的蓝花盆,蓝花盆处的红花盆做循环式交换。
算法设计:
    为了知道红,黄花盆直接交换次数,红,蓝花盆直接交换次数,黄,蓝花盆直接交换次数,以及循环交换的次数。预先统计出该放红换盆处的黄,蓝花盆个数R1,R2,该放黄花盆处的红,蓝花盆个数S1,S2,,该放蓝换盆处的红,黄花盆个数T1,T2
    红,黄直接交换次数n1=min(R1,S1)
    红,蓝直接交换次数n2=min(R2,T1)
    黄,蓝直接交换次数n3=min(R2,T2)
    若R1>S1,则此时红花盆处还有黄花盆,显然此时黄花盆处必然有蓝花盆,....因此循环交换次数为:N4=R1-S1
实现要点:
    实现中并不用专门的统计交换次数,而是将3n个数据存储在n*3的二维矩阵中,这样第一列放红,第二列放黄,第三列放蓝,程序主要由直接交换和循环交换两部分组成。
    直接交换由二重循环完成,定解条件为(i,j代表需要交换花盆的行数) 
    if a[i][1] == 2 && a[j][2] == 1     //红,黄花盆直接交换
    if a[i][1] == 3 && a[j][3] == 1     //红,黄花盆直接交换
    if a[i][1] == 3 && a[i][3] == 2     //黄,蓝花盆直接交换
    循环交换由三层循环完成,定解条件为(i,j,k代表需要的交换的行数):
    if a[i][1] ==2 && a[j][2] ==3 && a[k][3] ==1:
        v=a[i][1];a[i][1]=a[k][3];a[k][3]=a[j][2];a[j][2]=v;
    if a[i][1] ==3 && a[j][2] ==1 && a[k][3] ==2:
        v=a[i][1];a[i][1]=a[j][2];a[j][2]=a[k][3];a[k][3]=v;
'''

def main():
    a = []
    for i in range(0,100):
        b = []
        for j in range(0,4):
            b.append(0)
        a.append(b)
    m = 0
    n = int(input("请输入n/3的值(n为花盆的盆数):"))
    for i in range
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值