开发“不倒翁问题”的算法

时间:2018-12-23 18:26:33

标签: algorithm

问题陈述:几只玻璃杯放在桌子的一行上。有些玻璃杯倒置,有些是正确的。需要将所有的制酒杯正确地向上移动。但是,玻璃杯不能单独转动。允许的动作是同时转动任意两个翻转开关。从这些杯子的初始状态可以正确地将所有杯子翻转?

我需要了解问题并为该问题开发算法

1 个答案:

答案 0 :(得分:1)

由于翻转开关开始上下颠倒或颠倒开始,请以二进制的方式来考虑-每个翻转开关都是:正确的方向= 0,不正确的=1。因此,当您完成问题时,总和为0(全0)。

还请注意,如果您一次必须执行2次操作,则可能有3种动作:

  • 将1翻转为0,将0翻转为1(净变化为-1 + 1 = 0)
  • 将两个0翻转为1(净变化为1 +1 = 2)
  • 将两个1翻转为0(净变化为-1-1 = -2)

由于只能将总和更改为+2和-2,因此起始总和必须为偶数-起始处必须存在偶数个不正确对齐的翻转开关。

由于偶数为1,所以您的算法应始终将每一个动作将两个1变为0。在开始可解决的设置上永远不需要做任何其他动作。

您的算法应将翻转开关表示为tumblers = [0,1,1,0]之类的位列表。 首先,通过汇总列表并检查偶数来检查可解性: solvable = (sum(tumblers)%2==0)。 仅在可解决的情况下,设置循环来解决:

if(solvable)
    while(sum(tumblers)!=0)
        found = 0
        indexA = null
        indexB = null
        foreach(tumblers as index=>tumbler)
            if(found==2)
                break //exit foreach loop since you found two 1's
            endif
            if(tumbler==1)
                found++
                if(indexA==null)
                    indexA = index
                else
                    indexB = index
                endif
            endif
        endforeach
        tumblers[indexA] = 0
        tumblers[indexB] = 0
    endwhile
endif