本次所練習使用的主要方法是遞迴
所要注意的主要問題是
要確定起訖點的相對位置,否則又由於遞迴**的順序會漏掉一些可行路徑
先橫向/縱向接近目標點,然後再橫向/縱向遠離目標點(最好對應)
例如: 假設訪問的順序是下上右左(相對於乙個固定的矩陣)
2 2 2 2 2 2 2 2 2
2 0 0 0 0 0 0 0 2
2 0 2 2 0 2 2 0 2
2 0 2 0 0 2 0 0 2
2 0 2 0 2 0 2 0 2
2 0 0 0 0 0 2 0 2
2 2 0 2 2 0 2 2 2
2 0 0 0 0 0 0 0 2
2 2 2 2 2 2 2 2 2
可能會忽略黃色所示的路徑
2 2 2 2 2 2 2 22
2 0 0 0 0 0 0 0 2
2 0 2 2 0 2 2 0 2
2 0 2 0 0 2 0 0 2
2 0 2 0 2 0 2 0 2
2 0 0 0 0 0 2 0 2
2 2 0 2 2 0 2 2 2
2 0 0 0 0 0 0 0 2
2 2 2 2 2 2 2 22
#include#include#include#includeusing namespace std;
int maze[200][200];
pairpath[500];
int cnt = 1, ptr = -1;//succ=0;
void print(int endpoint)
} if(j==3) printf("\n");
}void visit(int xp, int yp, int xaim, int yaim)
if (maze[xp ][yp+1] == 0)visit(xp, yp+1, xaim, yaim);
if (maze[xp +1][yp] == 0)visit(xp+1, yp, xaim, yaim);
if (maze[xp][yp -1] == 0)visit(xp, yp - 1, xaim, yaim);
if (maze[xp-1][yp] == 0)visit(xp-1, yp, xaim, yaim);
//if (succ == false)
};int main()
visit(1, 1, 7, 7);
system("pause");
return 0;
}
tips:
本**中用到了檔案流,檔案中儲存的迷宮如以上所述,讀者若要檢測自己的迷宮的話則要更改**的相應部分,包括檔案流的重新設定和遞迴順序的調整(本**檢測的起止點是從左上到右下,其他起止點相對順序要更改相應的遞迴順序)
本**還用到了字串流
**中注釋掉的部分是在練習過程中出錯的部分,僅供參考
求解迷宮問題的所有路徑及最短路徑程式
路障 路障路障 路障路障 路障路障 入口 路障路障路障 路障 路障路障 路障路障路障路障 出口 路障路障 路障路障 路障路障 路障如上圖,要求輸出迷宮的所有路徑,並求出最短路徑長度及最短路徑。入口座標設為 1,1 出口座標設為 4,4 親,接下來 include define m 4 行數 defi...
非遞迴求解迷宮所有路徑問題遇到的BUG
不知道有沒有人和我一樣,在用棧求解迷宮問題所有可行解得時候,會遇到相同路徑重複輸出的bug。我看了網上問其他部落格的 發現也有這個bug,功夫不負有心人,花了1小時之久終於發現了bug!bug如下圖 上的路徑1,2重複了,路徑4,5重複了,除去重複路徑,真實的路徑只有4條。接下來展示排錯前的 也是出...
用棧解決迷宮問題(輸出所有路徑和最短路徑)
include includeusing namespace std define m 4 行數 define n 4 列數 define maxsize 100 棧最多元素個數 int mg m 2 n 2 struct migong stack maxsize path maxsize 定義棧和...