'''
有三个花盆,红色,蓝色,黄色各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
按规律摆放红蓝花盆(python)实现
最新推荐文章于 2023-09-14 15:08:56 发布