zoukankan      html  css  js  c++  java
  • 微软面试题 状态机

    已知 圆盘上有4个开关 分布在正方形的4个角上

    1.每个开关都只有两个状态 开或者关 ; 触摸一下开关 它的状态就会互相转换(开->关  关->开)

    2.你看不到现在开关的状态是什么,你也不能通过触摸判断现在的开关是开还是关

    3.每一次操作你可以选择改变一个开关的状态,或者改变两个开关的状态

    4.操作完成后 ,圆盘会随机转动, (也就是说你下一次操作的时候这些开关的位置都已经移动了)

    5.由于正方形的相邻点和对角点距离不一样 ,那么在你改变两个开关的时候,你可以通过这个判断你改变的是对角点还是相邻点

    6.当开关完全打开或者完全关闭的时候,  外面有个灯就会亮起来, 那么恭喜你 你搞定了

    问:

     有没有一种严格的流程能使所有的初始状态通过一定的操作都可以达成目标 让那个灯亮起来

    PS:这个题目主要是关于状态机 和状态机之间的状态转化的问题

    PS:个人感觉这个题目很难,如果没有遇到过 或者找对思路 是非常难解决的

    简单解法逻辑:

      可以证明初始状态只有4种 0000 0001 0011 0101  其他的状态均和这些状态等价

      例如 0000=1111   0001=0010=1110 (无法判断开和关 以及不知道顺序的原因)

      由于0000 已经是结果, 那么初始就只可能存在三种状态

      A:0001   B:0011  C:0101

    操作流程:

      进去先按一次对角的两个开关 如果初始状态是C:0101 那么必然到达最终结果

      如果初始状态不是C 那么有两种情况 0011和0001

        假设初始是B:0011 可以证明0011在对角两个开关被按下的时候会转为0110或者其他,但是全部等价于0011,所以当前状态还是0011

        接下来对当前状态0011按一次相邻的两个开关,当前状态要么变为0000 要么变为0101, 0000就直接成功了,如果没成功就再按一次对角的开关 那么0101必然变为0000

        

        如果当前是0001 那么不管按多少次操作(每次操作按两个按钮) 那么最终状态还是等价于0001 , 这个时候只要操作一次(只按一个开关) 那么0001会转变为0000 0011 0101三种中的一种 然后再回到上面的操作逻辑做一次 就解出来了

    图表操作逻辑

    初始状态

    A:0101

    B:0011

    C:0001

    按对角的两个开关

    完成

    依然等价0011

    依然等价0001

    按相邻的两个开关

    N/A

    完成            变成0101

    依然等价0001

    按对角的两个开关

    N/A              完成

    依然等价0001

    按任意一个开关

                         N/A

    完成       0011或0101

    如果还没有成功现在只有0011和0101了 在按上面的操作一次就ok了

    PS:解法是很简单 不过没有找对路子就很麻烦了

  • 相关阅读:
    什么是Python???
    python中闭包详解
    python类中的__init__和__new__方法
    python中不需要函数重载的原因
    装饰器详解
    IDEA中导入非maven项目(从eclipse中迁移过来的)
    CLion、cmake、mingw、openCV安装
    跨域问题的一些思考
    maven中jar包手动导入
    对于序列化的理解
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/1922699.html
Copyright © 2011-2022 走看看