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