《連連看》的演算法

2021-04-08 21:36:44 字數 1202 閱讀 9305

連連看所要求的是:

1:兩個目標是相同的

2:兩個目標之間連線線的折點不超過兩個。(連線線由x軸和y軸的平行線組成) 那麼分析一下連線的情況可以看到,一般分三種情況

1:直線相連 2:乙個折點 3:兩個折點 如圖:

可以發現,如果有折點,每個折點必定有且至少有乙個座標(x或者y)是和其中乙個目標點是相同的,也就是說,折點必定在兩個目標點所在的x方向或y方向的直線上。

所以設計思路就是:

假設目標點 p1 , p2 ,如果有兩個折點分別為z1 , z2 那麼,所要進行的是

1:如果驗證p1 , p2 直線連線,則連線成立

2:搜尋以p1,p2的x,y方向四條直線(可能某兩條直線會重合)上的有限點,每次取兩點作為z1,z2 ,驗證p1到z1/z1到z2/z2到p2 是否都能直線相連 ,是則連線成立。(如果z1=z2也就是只有乙個折點嘍,對判斷沒影響)

那麼程式演算法上,這裡先就理論進行乙個試驗

var mmap=new array();

mmap[0]=new array(0,0,0,0,0,0);

mmap[1]=new array(0,1,2,8,1,0);

mmap[2]=new array(0,5,5,4,3,0);

mmap[3]=new array(0,4,6,7,3,0);

mmap[4]=new array(0,8,2,6,7,0);

mmap[5]=new array(0,0,0,0,0,0);

p1=new array(1,4);

p2=new array(1,2);

//定義乙個二維陣列作為遊戲的映像,相同的數字代表相同的圖示,0是空處,p1,p2是選擇的點 linelink=function(o1,o2)else

}else }

// 上面這個函式是判斷任意兩個點是否能直線連線(中間的點全為0) var parr=new array();

pickpoint=function(q1,q2)

if(linelink(p1,p2))else }

} }

return false; }

//上面這個函式是校驗兩個目標點是否相連,

//先判斷是否同類點,再判斷是否直線相連,最後搜尋parr裡的每對折點是否使目標點相連 pickpoint(p1,p2); //取得parr陣列

trace(islink(p1,p2)); //測試p1,p2是否相連

連連看演算法

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

連連看演算法

分類判斷法 這裡實質上是一種遞迴的思想,要判斷a與b能否通過一條有n個轉角的路徑相連,可以轉化為判斷能否找到c,c與a能直線相連,且c與b能用一條有n 1個轉角的路徑相連。若這樣的c存在,那麼a與b就可以通過一條有n個轉角的路徑相連。根據轉角數不得超過2個的規則,我們可以分為轉角數分別為0個 1個 ...

連連看 演算法筆記

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