遊戲 - 假設有一個 n × n 的方格陣列。其中,有些方格是空的,有些是實心的,有些是非實心的方格由整數 1、2、3、... 設定。每個整數在棋盤上保持或佔據恰好兩個不同的方格。玩家的任務是藉助僅實現水平和垂直移動的簡單路徑來連接棋盤上每個整數的兩次出現。不允許兩條不同的路徑彼此相交。任何路徑都不能包含任何實心方塊(實心方塊不允許出現在任何路徑上)。最後,所有非實心方塊必須由路徑填入。
演算法 - 要建構一個具有給定棋盤尺寸 n × n 的有效隨機謎題,我們首先產生隨機簡單的相互不相交的路徑在黑板上。如果一些孤立的方塊仍然位於所有生成的路徑之外,請將這些孤立的方塊標記為實心(禁止)。接下來,我們提供路徑的端點和實心方塊的清單作為謎題。
因此,我們首先產生一個解決方案,然後根據該解決方案計算謎題。路徑和實心方塊將 n × n 板分開。我們實作並尋找資料結構來產生此分區。資料結構處理棋盤上 n^2 個方格集合的子集。
定位方格(a 、b) 和(c, d) 隨機出現在棋盤上,使得-
(a, b) 和(c, d) 是彼此的鄰居,而
(a, b) 和(c, d) 都不屬於迄今為止生成的任何路徑。如果在 整個棋盤,返回 FAILURE /* 這裡,(a, b) 和 (c, d) 是新路徑上的前兩個方塊 建。 */
對兩個並尋找樹進行並集,其中包含 (a, b) 和 (c, d)。
重複,直到目前路徑可以擴展 -
#重命名 (a, b) = (c, d)。
找出一個隨機相鄰的正方形(c, d) (a, b) 使得-
( c, d) 不屬於迄今為止生成的任何路徑(包括當前路徑)
部分構建的當前路徑上唯一的鄰居(c, d) 是(a, b)。
如果找不到這樣的鄰居(c,d),則路徑無法進一步延伸,因此打破循環
否則,將(a, b) 和(c, d) 所屬的兩個並找出樹。
設定位於起始處和位於起始處的兩個方塊的端點標誌終止新路徑。
返回SUCCESS
以上是C/C++中的數位連線遊戲?的詳細內容。更多資訊請關注PHP中文網其他相關文章!