連連看演算法

2021-08-25 21:40:37 字數 1651 閱讀 9544

分類判斷法

這裡實質上是一種遞迴的思想,要判斷a與b能否通過一條有n個轉角的路徑相連,可以轉化為判斷能否找到c,c與a能直線相連,且c與b能用一條有n-1個轉角的路徑相連。若這樣的c存在,那麼a與b就可以通過一條有n個轉角的路徑相連。

根據轉角數不得超過2個的規則,我們可以分為轉角數分別為0個、1個、2個這三種情況分別討論。

(2)乙個轉角連通:其實相當於兩個劃出乙個矩形,這兩個是一對對角頂點,另外兩個頂點如果可以同時和這兩個棋子直連,那就說明可以"一折連通"。見下圖兩個紅色棋子的連通情況,右上角打叉的位置就是折點。

圖1.乙個轉角連通

(3)兩個轉角連通: 判斷a與b能否經過有兩個轉角的路徑連通實質上可以轉化為判斷能否找到乙個點c,這個c點與a可以直線連通,且c與b可以通過有兩個轉角的路徑連通。若能找到這樣乙個c點,那麼a與b就可以經過有兩個轉角的路徑連通 。

判斷是否經兩個轉角連通的演算法需要做兩個方向上的掃瞄:水平掃瞄和垂直掃瞄。

水平掃瞄。如下圖所示,為了判斷a,b能否通過2個轉角連通,則從a開始在水平方向上向左右掃瞄,並判斷經過的點能否與b點經過1個轉角連通。顯然c點能與b點經1個轉角連通,故a,b能經2個轉角連通。

圖2.兩個轉角連通的判斷

垂直掃瞄。如下圖所示,為了判斷a,b能否通過2個轉角連通,則從a開始在垂直方向上下掃瞄,並判斷經過的點能否與b點經過1個轉角連通。顯然c點能與b點經1個轉角連通,故a,b能經2個轉角連通。

圖3 .兩個轉角連通的判斷

2.以轉角數為基準的廣度優先搜尋法

這種演算法參考《程式設計之美》。

這種演算法的動機:若能將所有與a經過不多於2個轉角的路徑相連的找出來,加入乙個集合s中。那麼判斷b與a能否相連只需判斷b是否存在於集合s中即可。採用廣度優先搜尋演算法可以方便的實現這一構想。演算法的思路如下:

(1)定義空集s與t,將a加入集合s

(2)找出所有與a能直接相連的點,將其加入集合s

(3)找出與集合s中的點能直接相連的點,加入集合t,然後將t中所有元素加入到集合s中,清空集合t

(4)找出與集合s中的點能直接相連的點,加入集合t,然後將t中所有元素加入到集合s中

(5)若b在集合s中,則a,b可以相連。否則a,b不能相連

模仿圖論中廣度優先搜尋的演算法,可以寫出以轉角為基準的廣度優先搜尋的偽**如下:

//判斷a與b能否經過不多於2個轉角的路徑相連的演算法

boolmatch( picture a,picture b )

t中的所有元素加入到s中

crossnum ++ ;

}if( b 在s中)

returntrue;

else

returnfalse;

}

連連看演算法

前幾天看了下a 演算法,發現並不能實現連連看。a 演算法是尋找最短路徑的一種高效率的演算法,而連連看的路徑並不一定是最短的。連連看的路徑最多只能轉折3次,因此判斷兩點的可延伸點是否有重複的,如果有,折為0或1 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...

《連連看》的演算法

連連看所要求的是 1 兩個目標是相同的 2 兩個目標之間連線線的折點不超過兩個。連線線由x軸和y軸的平行線組成 那麼分析一下連線的情況可以看到,一般分三種情況 1 直線相連 2 乙個折點 3 兩個折點 如圖 可以發現,如果有折點,每個折點必定有且至少有乙個座標 x或者y 是和其中乙個目標點是相同的,...

連連看 演算法筆記

這幾天都沒有更新blog,正在用休息時間編寫乙個連連看的小遊戲,目前已經完成,還在測試階段,準備加如點背景 和效果.測試完成後再發布遊戲 象連連看這類遊戲,就是最短路徑求解,演算法要求如下 乙個int 型別的2維陣列,定義為 public const int tilerowcount 19 publ...