自学Python:三色旗
假设有一条绳子,上面有红、白、蓝三种颜色的旗子。开始时绳子上旗子的颜色并没有顺序,现在要对旗子进行分类,并按照蓝、白、红的顺序排列。需要注意的是只能在绳子上进行移动,并且一次只能调换两个旗子,则如何移动才能使旗子移动的次数最少。
下面直接上代码:
########################
def SWAP(x,y):#交换旗子
temp=color[x]
color[x]=color[y]
color[y]=temp
if __name__ == '__main__':
WHITE = '白'
RED = '红'
BLUE = '蓝'
color = ['红', '白', '蓝', '白', '白', '蓝', '红', '蓝', '白', '红']
w, b, r = 0, 0, len(color)-1 #定义字符数组
for i in range(len(color)):# 打印出移动前绳子上旗子的颜色
print(color[i], end=' ')
print()
while w <= r:# 移动过程
# 遇到的是白旗
if color[w] == WHITE:
w += 1 # 白旗指针自增1
# 遇到的是蓝旗
elif color[w] == BLUE:
SWAP(b, w) # 交换蓝旗指针和白旗指针所指向的旗子
b += 1 # 蓝旗指针自增1
w += 1 # 白旗指针自增1
# 遇到的是红旗
else:
# 移动红旗指针使其指向当前最靠前的非红旗位置
while w < r and color[r] == RED:
r -= 1 # 红旗指针自减1
SWAP(r, w) # 交换红旗指针和白旗指针所指向的旗子颜色
r -= 1 # 红旗指针自减1
for i in range(len(color)):
print(color[i],end='')
print()
########################
执行结果如下:
红 白 蓝 白 白 蓝 红 蓝 白 红
白白蓝白白蓝红蓝红红
白白蓝白白蓝红蓝红红
白白蓝白白蓝红蓝红红
蓝白白白白蓝红蓝红红
蓝白白白白蓝红蓝红红
蓝白白白白蓝红蓝红红
蓝蓝白白白白红蓝红红
蓝蓝白白白白蓝红红红
蓝蓝蓝白白白白红红红
________________END______________