這條儘管是模板題,但我也卡了很久。
每一個狀態的表示為三進制的列,例如一個m為5的grid的表示方法為(012012) 3 ,當中0是無插頭,1是左插頭,2是右插頭,詳見cdq的論文。
因m最大是12,即是一個state的memory可以是3 13 這樣大,即是1594323。如果每一次都要clear memory,或者開個12x12x1594323的array,這都是不可能的,因此我用了hash的方法。而因為state的用量不高,因此可以用open addressing。我個人用的hash size是32767。
轉換方法分為三類(假設現在在第1格)︰
0123456 0123456 _____ --> ____ _| __|
1. 開新插頭,例︰
0000000 -> 0120000
2. 延伸插頭,例︰
0100200 -> 0100200 或 0010200
3. 合併插頭,例︰
Case (a): 0110220 -> 0000120 (1和2是對等的)
Case (b): 1210020 -> 1000020
Case (c): 0120000 -> 0000000 (只會在最後的空格發生)
我用了好一點時間code好了以上的case,卻得到WA的回覆了。放棄了好一陣子,直至今天才去認真debug,結果錯在case 3a︰
由0111222(第一格),我的錯誤program將它轉成0001122,正確應是0001212。完全miss了論文中12對應的特性。最後終於AC了。