微軟面試題 狀態機
已知 圓盤上有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:解法是很簡單 不過沒有找對路子就很麻煩了
浙公網安備 33010602011771號