首先來看一下迷宮簡易圖
我們用 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分別表示迷宮中的通路和障礙。設計乙個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論,基本要求 首先實現乙個以煉表作儲存結構的棧型別,然後編寫乙個求解迷宮的非遞迴的程式,求得的通路以三元...