迷宮問題 棧的應用

2021-07-11 04:17:58 字數 1660 閱讀 2286

問題描述:

以m*n的矩陣表示迷宮圖,數字0代表通路,數字1代表障礙。對於走過的路徑,將數字0替換為數字2,便於檢視通路路徑。計算機解迷宮通常用的是「窮舉求解」方法,即從入口出發,順著某乙個方向進行探索,若能走通,則繼續往前進;否則沿著原路退回(回溯),換乙個方向繼續探索,直至出口位置,求得一條通路。

注:對於迷宮的矩陣,我們不必每次從cmd端輸入,可在文件中以txt的形式定義儲存,其相對路徑為當前工程目錄下,絕對路徑為任意位置,但在開啟該檔案時,要提供該檔案的詳細路徑名。(本程式定義的mazemap迷宮圖儲存在桌面上)

#define _crt_secrue_no_warnings

#include#include#includeusing namespace std;

#define n 10

struct pos

};templatebool searchmazepath(int* arr, int n, pos entry, stack& paths) //尋找迷宮的通路。

//向上探索

pos tmp = cur;

--tmp._row;

if (arr[tmp._row*n + tmp._col] == 0)

//向下探索

tmp = cur;

++tmp._row;

if (arr[tmp._row*n + tmp._col] == 0)

//向左探索

tmp = cur;

--tmp._col;

if (arr[tmp._row*n + tmp._col] == 0)

//向右探索

tmp = cur;

++tmp._col;

if (arr[tmp._row*n + tmp._col] == 0)

paths.pop(); //若上下左右都不通,則回溯。

} return false;

}//讀入迷宮

void getmaze(int* arr,int n)

}} }

}//輸出迷宮

void printmaze(int* arr, int n)

cout << endl;

} cout << endl;

}//測試用例

void test()

;//n由巨集預編譯階段替換

pos sp(2, 0);//入口座標

getmaze((int*)arr, n);

printmaze((int*)arr, n);

stackpaths;//建立路徑棧

searchmazepath((int*)arr, n, sp, paths);//二維陣列實際儲存是一維陣列,所以強制轉換成一維用於傳參。

printmaze((int*)arr, n);

}int main()

注:對於當前位置為「死路」時,需要進行回溯,退回到最近一次可走的位置點,但是每一次的回退依然存在上下左右的判斷,效能上依舊可以優化,可以借助遞迴的方式簡化回退的重複探索問題,並且對於存在多條通路路徑時,還存在最優的路徑問題,即最短路徑的判斷,所以說該程式只是迷宮問題的基礎實現。。

棧的應用 迷宮問題

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...