這是幾個由二維陣列構成的迷宮,簡單的迷宮,多通路不帶環的迷宮,多通路帶環的迷宮!對於簡單迷宮我們需要判斷是否有出口!對於多通路不帶環的迷宮我們需要確定出口並且判斷最短路徑,對於通路間帶環的迷宮我們需要找出最短路徑!
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
在本題中也用到的就是回溯, 就是把走過的點座標壓棧,遇到無路可走的情況就開始回溯,也就是出棧!
總體思路就是:
所有**位於github:
對於簡單迷宮的核心**:
int
checkaccess
(pos next)
}//return 0表示不可以通過
return0;
}int
mazegetpath
(pos entry,pos exit)
//下 next = cur;
next._row +=1
;if(checkaccess
(next)
)//左
next = cur;
next._col -=1
;if(checkaccess
(next)
)//右
next = cur;
next._col +=1
;if(checkaccess
(next)
)//回溯
stackpop
(&path);}
return0;
}
對於稍複雜的迷宮的核心**
int
checkaccess
(pos next)
}//return 0表示不可以通過
return0;
}int
mazecheckisaccess
(pos cur, pos next)
//return 0表示不可以通過
return0;
}int pathsize =0;
intmazegetpath
(pos entry,pos exit)
}//探測下一次可以去的地方
//上 pos next = cur;
next._row -=1
;if(checkaccess
(next)
)//下
next = cur;
next._row +=1
;if(checkaccess
(next)
)//左
next = cur;
next._col -=1
;if(checkaccess
(next)
)//右
next = cur;
next._col +=1
;if(checkaccess
(next)
)//回溯
stackpop
(&path);}
return0;
}int
mazegetshortpath
(pos entry, pos exit)
}//探測下一次可以去的地方
//上 pos next = cur;
next._row -=1
;if(mazecheckisaccess
(cur, next)
)//下
next = cur;
next._row +=1
;if(mazecheckisaccess
(cur, next)
)//左
next = cur;
next._col -=1
;if(mazecheckisaccess
(cur, next)
)//右
next = cur;
next._col +=1
;if(mazecheckisaccess
(cur, next)
)//回溯
迷宮問題 棧的應用
問題描述 以m n的矩陣表示迷宮圖,數字0代表通路,數字1代表障礙。對於走過的路徑,將數字0替換為數字2,便於檢視通路路徑。計算機解迷宮通常用的是 窮舉求解 方法,即從入口出發,順著某乙個方向進行探索,若能走通,則繼續往前進 否則沿著原路退回 回溯 換乙個方向繼續探索,直至出口位置,求得一條通路。注...
棧的應用 迷宮問題
include define maxsize 100 typedef struct box typedef struct sttype bool mgpath int mg 10 10 int xi,int yi,int xe,int ye 求解路徑為 xi,yi xe,ye int main if...
棧的應用 迷宮
使用c 構建帶環迴路迷宮,並使用迭代法,遞迴法求出口 使用遞迴方法求迷宮的最短路徑 其實在列印最短路徑是使用佇列的話路徑就不是反著的了 pragma once includeusing namespace std include includetypedef struct pos pos class...