4.4.4求解迷宫问题
生活随笔
收集整理的這篇文章主要介紹了
4.4.4求解迷宫问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:
有如下8*8的迷宮圖: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO其中,O表示通路方塊,X表示障礙方塊。假設入口是位置(0,0),出口為右下角方塊位置(7,7)。設計一個程序采用遞歸方法求指定入口到出口的一條迷宮路徑
問題求解:
用n表示迷宮大小,二維數組Maze存放迷宮,從(x,y)方塊可以試探上下左右4個方位,假設總是從方位0到方位3的順序試探, 各方位對應的水平方向偏移量H[4] = {0,1,0,-1},垂直偏移量V[4] = {-1,0,1,0}方法一:采用深度優先的遍歷方法
#include <bits/stdc++.h> using namespace std;#define MAxN 10 int n = 8; char Maze[MAxN][MAxN] = { {'o','x','x','x','x','x','x','x'}, {'o','o','o','o','o','x','x','x'}, {'x','o','x','x','o','o','o','x'}, {'x','o','x','x','o','x','x','o'}, {'x','o','x','x','x','x','x','x'}, {'x','o','x','x','o','o','o','x'}, {'x','o','o','o','o','x','o','o'}, {'x','x','x','x','x','x','x','o'} }; void disppath(){for(int i = 0; i < n; i++){cout << " ";for(int j = 0; j < n; j++)cout << Maze[i][j];cout << endl;} } int h[4] = {0, 1, 0, -1}; int v[4] = {-1, 0, 1, 0}; void DFS(int x, int y){if(x == n -1 && y == n -1){Maze[n - 1][n -1]= ' ';disppath();return;}else{for(int k = 0; k < 4; k++){if(x >= 0 && y >= 0 && x < n && y < n && Maze[x][y] == 'o'){ // 若(x, y)是可以走的 Maze[x][y] = ' '; // 將該方塊迷宮置為空格 DFS(x + h[k], y + v[k]); // 查找(x, y)周圍的每一個方塊 Maze[x][y] = 'o'; // 若從該相鄰方塊出發沒有找到路徑,恢復(x, y)迷宮值 }}} }int main(){int x = 0, y = 0;cout << " 迷宮的一條路徑:" << endl;DFS(x, y);return 0; }方法二:采用廣度優先遍歷方法
采用廣度優先遍歷方式,從(x,y)出發(初始為入口)搜索目標(出口)。由于STL中queue不能順序遍歷,這里采用一個數組作為非循環隊列,front和rear分別為隊頭和隊尾(初始時均設置為-1),每個進隊元素有唯一的下標
隊列元素類型聲明如下:
struct Position //隊列元素類型 { int x,y; //當前方塊位置int pre; //前驅方塊的下標 }; #include <bits/stdc++.h> using namespace std;#define MAXQ 100 // 自定義隊列的大小 #define MAxN 10 // 最大迷宮大小int n = 8; char Maze[MAxN][MAxN] = {{'o','x','x','x','x','x','x','x'},{'o','o','o','o','o','x','x','x'},{'x','o','x','x','o','o','o','x'},{'x','o','x','x','o','x','x','o'},{'x','o','x','x','x','x','x','x'},{'x','o','x','x','o','o','o','x'},{'x','o','o','o','o','x','o','o'},{'x','x','x','x','x','x','x','o'} };int h[4] = {0, 1, 0, -1}; // 水平偏移量 int v[4] = {-1, 0, 1, 0}; // 垂直偏移量struct Position {int x, y; // 當前位置方塊int pre; // 前驅方塊的下標 };Position qu[MAXQ]; // 定義一個隊列 int front = -1, rear = -1; // 定義對頭和隊尾void disppath(int front) {int i,j;for(i = 0; i < n; i++)for(j = 0; j < n; j++) {if(Maze[i][j] == '*')Maze[i][j] ='0';}int k = front;while(k != -1) {Maze[qu[k].x][qu[k].y] = ' ';k = qu[k].pre;}for(int i = 0; i < n; i++) {cout << " " ;for(int j = 0; j < n; j++)cout << Maze[i][j];cout << endl;} }void BFS(int x, int y) {Position p, p1, p2;p.x = x, p.y = y;p.pre = -1;Maze[p.x][p.y] = '*'; // 改為*,避免重復查找qu[++rear] = p; //入口方塊進隊while(front != rear) {p1 = qu[++front]; // 出隊方塊p1if(p1.x == n -1 && p1.y == n-1) {disppath(front);return;}for(int k = 0; k < 4; k++) { //試探p1的每個相鄰方塊p2.x = p1.x + h[k];p2.y = p1.y + v[k];if(p2.x >= 0 && p2.y >= 0 && p2.y < n && p2.y < n && Maze[p2.x][p2.y] == 'o') {Maze[p2.x][p2.y] = '*'; // 改為*,避免重復查找p2.pre = front;qu[++rear] = p2; // 滿足條件的p2,會進隊}}}}int main() {int x = 0, y = 0;cout << "一條路徑為:" << endl;BFS(x, y);return 0; }總結
以上是生活随笔為你收集整理的4.4.4求解迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CV小白成长记之一:去除图片背景印记及噪
- 下一篇: css文本样式有,CSS文本常用样式