之前寫過乙個用bfs解決迷宮最短路的問題,這篇文章則是另外乙個問題,那就是輸出迷宮的所有可能路徑。直接看樣例輸入輸出就明白題意了:
樣例輸入1
3
s..*.*
..e
3代表迷宮是3 ×
\times
× 3的,s
代表起點,e
代表終點,.
代表路,'*'
代表牆壁。
樣例輸出1
(0,1)(1,1)(2,1)(2,2)
顯然這個迷宮只有一條路徑,上述輸出了從起點的下一步開始的所有點座標。
樣例輸入2
3
s..*..
..e
樣例輸出2(0,1)(0,2)(1,2)(2,2)
(0,1)(0,2)(1,2)(1,1)(2,1)(2,2)
(0,1)(1,1)(1,2)(2,2)
(0,1)(1,1)(2,1)(2,2)
這個迷宮問題有4個解。
資料規定
規定輸入位置座標一定是(0,0),迷宮是正方形,且最大規模不超過100 ×
\times
× 100.
(想讓迷宮是長方形也可以,給下面的程式加乙個長度或者寬度的變數就行了)
核心演算法用偽**表示:
// 從當前點(x,y)開始尋找終點
findpath
(int x,
int y)
else
} 取消(x,y)訪問標記;
}
所用資料結構及輔助功能的構造不贅述,詳見參考**。
#
include
#define
maxn
105int flag[maxn]
[maxn]
;// 訪問標記
char map[maxn]
[maxn]
;// 地圖
int dx[4]
=;int dy[4]
=;// 儲存路徑的座標,如果用c++,可以用pair代替
int path_x[maxn*maxn]
;// 儲存路徑的橫座標
int path_y[maxn*maxn]
;// 儲存路徑的縱座標
int length;
// 除了終點外的路徑點數
int n;
// 地圖的規模
void
findpath
(int x,
int y)
printf
("\n");
}else}}
flag[x]
[y]=0;
}int
main()
getchar()
;}findpath(0
,0);
}return0;
}
拓展一道題:騎士遊歷問題,輸入棋盤規模,輸入騎士的初始座標,騎士只能走「日」字形,求乙個能不重複走完所有格仔的路徑。
也是使用迷宮問題的演算法思想,但是這個演算法用在騎士遊歷問題上,複雜度相當高,執行程式時肉眼可見的慢。網上還有結合貪心法的解法,那個應該是求解騎士遊歷問題的合理解法,這裡我僅僅為迷宮問題作拓展鞏固。
// 這個演算法複雜度太高了,是指數級別的,執行速度肉眼可見的慢
// 網上還有一種方法是結合了貪心法的思想,如果以後有興趣可以看(可以去參考
#include
#define
maxn
105int flag[maxn]
[maxn]
;int end =0;
// 標記程式是否結束
int count =0;
// 武士棋已走步數
int n;
// 棋盤規模
int path_x[maxn+1]
, path_y[maxn+1]
;int start_x, start_y;
// 起點座標
int dx[8]
=;int dy[8]
=;void
findpath
(int x,
int y)
printf
("\n");
}else
count--;}
}}flag[x]
[y]=0;
}int
main()
return0;
}
棧 求迷宮所有解
maze.cpp 定義控制台應用程式的入口點。include stdafx.h include define stack init size 100 define stack add size 10 define row number 3 define col number 3 typedef st...
用遞迴函式求出迷宮所有解
牆元素值為0,可通過路徑為 1,通過路徑為足跡。輸入格式為x,y,中間有逗號。依次試探東南西北四個方向 include using namespace std struct postype 迷宮座標位置型別 define maxlength 25 設迷宮的最大行列為25 typedef int ma...
用棧解決迷宮問題(輸出所有路徑和最短路徑)
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 定義棧和...