迷宮求解 遞迴

2021-08-18 21:32:39 字數 3178 閱讀 4422

首先來看一下迷宮簡易圖

我們用 0 來表示該位置是牆, 用 1 來表示該位置是路. 所以, 我們在處理迷宮問題的時候可以將其看成乙個二維陣列即可, 而對應的每一條路我們可以用座標的形式將其表示, 所以還需要有乙個結構體來描述對應的點的

1. 相關資料結構

typedef

struct maze

maze;

typedef

struct point

point;

2.迷宮初始化

所謂的初始化迷宮就是將這個二維陣列初始化, 我們自己定義乙個二維陣列, 然後將其每乙個值賦值給我們的迷宮地圖即可

void mazeinit(maze* maze)

int map[max_row][max_col] = ,,,

,,};int row = 0;

int col = 0;

for(; row < max_row; row++)}}

3.迷宮探索

迷宮探索即就是從給出的迷宮入口開始, 一直往後探索, 直到找到出口為止. 我們利用函式在遞迴的過程中會形成棧楨的特性, 依次將我們所探索的為位置進行壓棧, 在此過程中, 我們必須得判斷當前的點是否合法, 同時必須判斷當前的點是否可以落腳, 如果可以落腳, 就現將該位置標記, 然後判斷當前位置是否是出口, 如果是出口, 說明迷宮探索完畢, 如果不是出口, 那麼我們就得必須找下乙個可以落腳的位置, 即我們依次按照順時針的方向依次遍歷當前位置四周的四個點(up, rught, down, left), 只要我們發現有乙個點可以落腳, 我們就將當前位置對應的點入棧(呼叫函式本身), 當四個方向都已經走完了, 那麼我們就得往回退, 即就是對應的出棧過程了.具體如下圖

//判斷當前點是否可以落腳

if(canstay(maze, cur))

//如果可以落腳, 就給當前位置標記

//如果當前點是出口, 則說明找到了一條路按順時針方向探測四個相鄰點, 遞迴呼叫函式自身,

//遞迴時更新 cur, (每次遞迴時, 這裡的點是下次要走的點, 無論能不能走交給遞迴判斷)

point up = cur;

up.row -= 1;

_getpath(maze, up, entry);

point right = cur;

right.col += 1;

_getpath(maze, right, entry);

point down = cur;

down.row += 1;

_getpath(maze, down, entry);

point left = cur;

left.col -= 1;

_getpath(maze, left, entry);

}else

}void getpath(maze* maze, point entry)

if(entry.row < 0 || entry.row >= max_row || entry.col < 0 || entry.col >= max_col)

//輔助完成遞迴

_getpath(maze, entry, entry);

mazeprint(maze);

}4.判斷是否可以落腳

即先判斷迷宮資料結構是否輸入合法, 接下來就是判斷當前位置是否合法, 如果不合法就退出, 如果當前位置對應的值是 1, 則說明能落腳, 否則就說明不能落腳.

int canstay(maze* maze, point cur)

if(cur.row < 0 || cur.row >= max_row || cur.col < 0 || cur.col >= max_col)

if(maze -> map[cur.row][cur.col] == 1)

return

0;}

5.判斷出口

如果該位置到達迷宮邊界, 並且不等於入口位置, 則說明到達出口

int i***it(maze* maze, point cur, point entry)

if(cur.row == entry.row && cur.col == entry.col)

if(cur.row == max_row -1 || cur.row == 0 || cur.col ==max_col -1 || cur.col == 0)

return

0;}

6.標記

將當前位置的值賦值為2

void mark(maze* maze, point cur)

if(cur.row < 0 || cur.row >= max_row || cur.col < 0 || cur.col >= max_col)

maze -> map[cur.row][cur.col] = 2;

}

7.列印迷宮函式

void mazeprint(maze* maze)

int row = 0;

int col = 0;

for(; row < max_row; row++)

printf("\n");}}

依次將回溯點列印出來,執行結果如圖

遞迴實現迷宮求解

首先在當前路徑前 有乙個maze.txt,儲存的內容為 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 ...

非遞迴實現迷宮求解

迷宮求解問題 用乙個m n的矩陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對給定的迷宮,求出找到的第一條從入口到出口的通路,或得到沒有通路的結論。我們指定 迷宮的入口為矩陣的左上角 1,1 迷宮的出口為右下角 m,n 路徑的探索順序依次為 東南西北 即 右下左上 輸入 第一行輸入兩個...

迷宮問題求解 C 非遞迴程式

迷宮問題求解 c 非遞迴程式 一 實驗內容 問題描述 以乙個m n的長方陣表示迷宮,0,1分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論,基本要求 首先實現乙個以煉表作儲存結構的棧型別,然後編寫乙個求解迷宮的非遞迴的程式,求得的通路以三元...