日更成长营自学编程Python

自学Python:三色旗

2022-04-04  本文已影响0人  小强聊成长

假设有一条绳子,上面有红、白、蓝三种颜色的旗子。开始时绳子上旗子的颜色并没有顺序,现在要对旗子进行分类,并按照蓝、白、红的顺序排列。需要注意的是只能在绳子上进行移动,并且一次只能调换两个旗子,则如何移动才能使旗子移动的次数最少。

下面直接上代码:

########################

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______________

上一篇 下一篇

猜你喜欢

热点阅读