數字華容道,是在4x4的格仔中,依次從左到右,從上到下放置1-15這15個數字。經過一定的隨機,必須將這15個數字復原。每個數字只能向相鄰的唯一空格移動。難度更高的,格仔和數字會更多,比如5x5。
我在開發乙個類數字華容道遊戲時,發現自己3x3的格仔,居然怎麼都解不出來。比如:一排1、2、3,二排4、5、6,三排8,7。經過網上查詢,才知道完全隨機位置的數值華容道僅有50%的概率是有解的。而我就是用的完全隨機方式去打亂次序。
網上有兩篇文章說的很好,以下是根據這兩篇文章的總結。
數字華容道必然有解的前提
首先,要弄清楚乙個概念:逆序數。逆序數,即乙個數字序列,將其中所有數字依次兩兩對比,若大數在前,小數在後,那麼這就是一對逆序數。這裡說到的逆序數,指的是數字序列中逆序數的數量。比如:上文提到的1、2、3、4、5、6、8、7,逆序數只有1個,即8和7。
另外,還有一點要提出來。一般來講,復原狀態(初始狀態)的數字華容道,會有乙個空格,一般會設定在最末行的右下角。但也可以根據實際的需求,設定在其他行。請留意,初始空格所在的行數,是決定是否有解的乙個重要因素。
數字華容道,必然有解,只存在於如下3個細分情形:
若格仔列數為奇數,則逆序數必須為偶數;
若格仔列數為偶數,且逆序數為偶數,則當前空格所在行數與初始空格所在行數的差為偶數;
若格仔列數為偶數,且逆序數為奇數,則當前空格所在行數與初始空格所在行數的差為奇數。
實際的推演涉及到我一時難以徹底理解的數學推算,我只能用淺顯的方式來理解這個問題。
為什麼?
首先,有解的前提在於:當前空格回到初始空格所在行數時,逆序數一定得是偶數!為什麼,我不清楚。
要想把空格移動到初始空格所在行,必須進行若干次上下移動和若干次左右移動。
左右移動,不會改變逆序數;上下移動,若格仔列數為奇數,則每次增減偶數個逆序數,若格仔列數為偶數,則每次增減奇數個逆序數。
也就是說:
格仔列數為奇數,怎麼移動,都不會改變原始的逆序數。因為奇數加減偶數還是奇數,偶數加減偶數還是偶數。所以,只要保證逆序數是偶數即可,不必關心空格的位置。
格仔列數為偶數,那麼進行奇數次上下移動,會改變其逆序數的奇偶性。所以,如果當前逆序數是偶數,要想有解,就要保證實際上下移動會進行偶數次,也就是說空格所在行與初始空格所在行的差為偶數。
同理,若當前逆序數是奇數,要想有解,要進行奇數次的移動,才能保證最終逆序數是偶數。
如何轉換逆序數奇偶性
具體實現應該很簡單,不多說了,就說一點。如果想更改乙個數字序列的逆序數的奇偶性,只需要調換一對逆序數的位置即可。
最後可能是cs106a課程上的一句話,並不是原文:
程式設計師要在不理解內在實現邏輯的情況下,也能順暢地使用別人的成果。
不理解沒關係,會用就行。
華容道3x3的技巧 數字華容道 無上限解題技巧
之前就聽過數字華容道,但是一直沒有上手,今天發現室友再玩,我就下了乙個,試了一下3x3 26秒,挺簡單的 有玩了下5x5 說實話,前面3行很順利,但是最後2行就比較 碰運氣 以及燒腦了。真不是謙虛,我完成了,但我知道我真的靠運氣,緊接著玩8x8 到最後兩行擺弄了20分鐘,直接放棄,我實在不想破壞上一...
hdu 6620 數字華容道定理
沒玩過數字華容道,網上找的,判斷兩張圖能不能相等,把1234行按順序插到前一行結尾,計算除0外的逆序對數,判斷兩張圖0所在的行差和逆序數的奇偶性,相同就能到,而且其他部落格都說80步,4 4的圖就可到 include include include include include include i...
華容道04 RoleSprite的設計
rolesprite用來根據role的資料類來顯示不同的角色,需要有乙個資料類的引用,在這裡將其錨點設定在左下角,方便計算其座標和進行碰撞檢測。屬性 m prole 角色資料的引用 m row 當前所在行 m col 當前所在列 m width 橫向佔的格仔數 m height 豎向佔的格仔數 ro...