暴力求解走迷宮 基於棧實現最短路徑的非遞迴方法

2021-08-18 02:02:21 字數 3536 閱讀 1350

乙個 datatype arr[n][n] = ,

, ,

, ,

, };這樣6×6的二位陣列就是乙個最簡單的最基礎的迷宮模型。我們知道入口,利用暴力求解,很容易找到出口,判斷是否有出路。我們很容易想到利用壓棧的方法,找到出口。while迴圈找滿足條件的下一步。找到出口返回。

但如果是多個出口呢。我們很容易想到遞迴,遞迴可以天然的可以返回到上一層。也就是說,遞迴函式在找到出口後並不是結束了,而是返回到上一層棧幀,繼續嘗試其他路是否可行。知道返回到最後一層結束。

我想用非遞迴模擬遞迴實現,我思考了下遞迴所要完成的具體步驟,遞迴函式實現了走的尾在退回頭的過程,棧一樣可以實現這個功能。

int mazegetpath(maze *pmaze)

//上

next->_col = cur->_col - 1;

next->_row = cur->_row;

if (mazecheckisaccess(pmaze, next))

//左

next->_col = cur->_col;

next->_row = cur->_row - 1;

if (mazecheckisaccess(pmaze, next))

//右

next->_col = cur->_col;

next->_row = cur->_row + 1;

if (mazecheckisaccess(pmaze, next))

//無論那個方向都通路都壓棧,然後當走不通時會自然的返回到岔口的另乙個口繼續走。棧是第一次便利這個點的時候就把所有通路存入棧中,而遞迴是返回後在尋找其他的路

} }

if (flag == 0)

printf(「沒有出口\n」);

free(next);

return 1;

} 但是這依然沒有解決我們環的情況,我們採用走一步記一步的方法,數值++,只有比自己數值大的路或者走沒有走過的通路。當我們遍歷過一遍,出口測的非0,最小只-1就是長度,這個橫縱座標就是最出口。

倒著走比自己數值少一的點,存入棧,就倒著走萬這條路了。

void stackshortpath(maze *pmaze, stack *path) }

printf(「the short path size is:%3d\n」, shortcount - 1);

printf(「the short path out is:(%d,%d)\n」, cur._col + 1, cur._row + 1);

pos next = (pos)malloc(sizeof(pos));

stackpush(&path, &cur);

while (cur._col != pmaze->_entry->_col || cur._row != pmaze->_entry->_row)

//上

next->_col = cur._col - 1;

next->_row = cur._row;

if (pmaze->_mz[next->_col][next->_row] == pmaze->_mz[cur._col][cur._row] - 1)

//左

next->_col = cur._col;

next->_row = cur._row - 1;

if (pmaze->_mz[next->_col][next->_row] == pmaze->_mz[cur._col][cur._row] - 1)

//右

next->_col = cur._col;

next->_row = cur._row + 1;

if (pmaze->_mz[next->_col][next->_row] == pmaze->_mz[cur._col][cur._row] - 1) }

} stackprint(path);

} void mazegetshortpath(maze *pmaze)

cur = stacktop(path);

stackpop(path);

//上next->_col = cur._col - 1;

next->_row = cur._row;

if (mazecheckisaccess(pmaze, next))

//左next->_col = cur._col;

next->_row = cur._row - 1;

if (mazecheckisaccess(pmaze, next))

//右next->_col = cur._col;

next->_row = cur._row + 1;

if (mazecheckisaccess(pmaze, next))

}}free(next);

if (flag == 0)

else

return ;

這裡我們先引入所需要使用基本的函式

#include#include#include typedef struct pos

pos;

typedef int datatype;

typedef struct stackstack;

void stackinit(stack** ps,size_t capacity)

pos stacktop(stack *s)

void stackpush(stack **pps, pos *x)

assert(*pps);

((*pps)->_mz[(*pps)->_size])._col = x->_col;

((*pps)->_mz[(*pps)->_size])._row = x->_row;

(*pps)->_size++;

} pos *stackpop(stack *ps)

int stackempty(stack *ps)

void stackprint(stack *ps)

以及迷宮的初始化等輔助函式

#pragma once

#include」stack.h」

#define n 6

typedef struct maze

maze;

void mazeinit(maze **pmaze,datatype a[n][n]) }

(*pmaze)->_entry = (pos*)malloc(sizeof(pos));

(*pmaze)->_entry->_col = 5;

(*pmaze)->_entry->_row = 2;

}

void mazeprint(maze *pmaze)

printf(「\n」);

} printf(「\n」);

} int mazecheckisaccess(maze pmaze ,pos pos)

return 0;

}

基於Dijsktra演算法的最短路徑求解

描述 一張地圖包括 n個城市,假設城市間有 m條路徑 有向圖 每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用 dijsktra 演算法求出起點到終點之間的最短路徑。輸入多組資料,每組資料有m 3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第二行有n個字元,代表每個城市的名...

基於Dijsktra演算法的最短路徑求解

基於dijsktra演算法的最短路徑求解 描述一張地圖包括n個城市,假設城市間有m條路徑 有向圖 每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用dijsktra演算法求出起點到終點之間的最短路徑。輸入多組資料,每組資料有m 3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第...

用棧求解迷宮問題的所有路徑及最短路徑程式

目的 掌握棧在求解迷宮問題中的應用。內容 編寫乙個程式,輸出迷宮的所有路徑,並求第一條最短路徑長度及最短路徑。如下 include include include include using namespace std define inf 0x3f3f3f const int maxsize 10...