问题陈述:几只玻璃杯放在桌子的一行上。有些玻璃杯倒置,有些是正确的。需要将所有的制酒杯正确地向上移动。但是,玻璃杯不能单独转动。允许的动作是同时转动任意两个翻转开关。从这些杯子的初始状态可以正确地将所有杯子翻转?
我需要了解问题并为该问题开发算法
答案 0 :(得分:1)
由于翻转开关开始上下颠倒或颠倒开始,请以二进制的方式来考虑-每个翻转开关都是:正确的方向= 0,不正确的=1。因此,当您完成问题时,总和为0(全0)。
还请注意,如果您一次必须执行2次操作,则可能有3种动作:
由于只能将总和更改为+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