連連看尋路時,使用回溯法進行逐步測試,如果發現某條路不行,則退一步再進行嘗試,可以使用遞迴來實現,遞迴方式**比較自然,另外也可以使用棧來實現,以下是一些實現思路:
定義節點node, node包含左,右,上,下四個標誌,表示這個節點是否進行了4個位置的尋路嘗試.
1. 首先將開始節點壓入棧.
2.判斷棧是否為空.
3.然後peek棧頂節點的node_x.
3.1判斷nodex_x的四個點是否存在目標節點,如果存在則尋路成功,跳到步驟4.
3.2如果node_x四個點存在通路(可行節點--已經消掉的方塊)則將這個相鄰的節點nodex_x_x壓入棧,跳到步驟2.
3.3如果node_x四個點多已經測試過了不是目標節點或不是可行點,那麼則彈出node_x,跳到步驟2.
4.棧變為空則表示無法找到有效路徑,不為空時棧裡的節點就是具體路線.
stack.push(node_start)
while(stack.count>0)else if(node_x.left)else if(node_x.right)else if(node_x.bottom)else{
/*四個節點都不可行則彈出棧*/
stack.pop();
說明:test*** **段會處理三種情況
1. 判斷鄰近一節點是否是目標節,是的話則將節點壓入棧然後跳出迴圈(break;)
2.鄰近點是可行節點(已經消掉的方塊),
2.1標記節點node_x (node_x.l|t|b|l=false;)
2.2標記節點node_x_x(node_x_x.r|b|t|r=false;) 具體取決於node_x是那個方向過來的,如果是right過來則將node_x_x.left設定成false以避免死迴圈);
2.3將這個節點(node_x_x)壓入棧繼續迴圈.(continue;)
3.不可行節點(未消除的方塊,或到了邊界)那麼將對應的top|left|bottom|right標記成false;
注意:2.1跟2.2步驟都沒標記的話則產生死迴圈,而只標記2.1沒標記2.2的話則會生進行一些多餘的比較("原路回測")使最終結果無法確定(可能是錯誤的結果),而標記2.2沒標記2.1時會出現死迴圈(某個消除了的節點反覆進棧出棧),各種情況自己畫圖找出.
關於連連看演算法
連連看尋路時,使用回溯法進行逐步測試,如果發現某條路不行,則退一步再進行嘗試,可以使用遞迴來實現,遞迴方式 比較自然,另外也可以使用棧來實現,以下是一些實現思路 定義節點node,node包含左,右,上,下四個標誌,表示這個節點是否進行了4個位置的尋路嘗試.1.首先將開始節點壓入棧.2.判斷棧是否為...
關於連連看尋路演算法的思路
圖 0,0,0,0,0,0,0,0 0,0 0,8,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,0,0,0,0 0,0 0,0,0,0,...
連連看演算法
前幾天看了下a 演算法,發現並不能實現連連看。a 演算法是尋找最短路徑的一種高效率的演算法,而連連看的路徑並不一定是最短的。連連看的路徑最多只能轉折3次,因此判斷兩點的可延伸點是否有重複的,如果有,折為0或1 可消除,如果沒有,再判斷每個延伸點的延伸點與目標點的延伸點是否有重複的,有則表示可以消除並...