回溯和遞迴實現迷宮問題(C語言)
前言
學完圖的資料結構,發現可以藉助其遍歷思想實現迷宮問題,遂用兩種方法編寫實現。
本文章僅展示標頭檔案、測試檔案以及遞迴函式的定義,鼓勵大家開動腦筋,自行補充回溯演算法。至於其他函式的實現,可以在文末下載。
題目背景
用nm的矩陣表述迷宮,位置(0,0)表示入口,(n,m)表示出口,n和m分別代表迷宮的行數和列數。迷宮中的每個位置都可以用其行號和列號來指定。在矩陣中,當且僅當一個位置(x,y)處有障礙時,其值為‘ * ’ , 否則其值為‘ ’。
題目要求
尋找一條從入口<0,0>到出口<5,5>的路徑
用遞迴和回溯兩個求解方案分別實現
演算法思想
遞迴實現
回溯實現
標頭檔案
#ifndef MAZE_PROBLEM_H
#define MAZE_PROBLEM_H
#include <stdio.h>
#include<stdbool.h>
#define MAXSIZE 6
//路口結構體定義
struct InterSection {
int i;//行號
int j;//列號
int right;//可走的方位號
} InterSection[MAXSIZE];
void MyPath(char maze[][MAXSIZE], int moved[][MAXSIZE]);
/*順序表結構體,用於輔助遞迴函式*/
typedef struct
{
int list[50][2];
int size;
}SeqList;
void ListInitiate(SeqList* L);
bool ListInsert(SeqList* L, int x, int y);
bool ListDelete(SeqList* L);
int ListOutput(SeqList* L);
bool RecursMaze(char maze[][MAXSIZE], int moved[][MAXSIZE], SeqList* L, int i, int j);
#endif // !MAZE_PROLBLEM_H
測試函式
int main() {
//迷宮陣列
char maze[MAXSIZE][MAXSIZE] = {
{' ',' ',' ',' ','*',' '},
{' ','*','*','*',' ',' '},
{' ',' ','*',' ',' ','*'},
{'*',' ',' ',' ','*',' '},
{'*','*',' ','*','*',' '},
{'*','*',' ',' ',' ',' '},
};
//記錄是否已訪問的陣列
int moved[MAXSIZE][MAXSIZE] = { 0 };
//MyPath(maze, moved);
SeqList MyTest;
ListInitiate(&MyTest);
RecursMaze(maze, moved,&MyTest ,0, 0);
ListOutput(&MyTest);
}
遞迴函式
#include "MazeProblem.h"
//遞迴實現
bool RecursMaze(char maze[][MAXSIZE], int moved[][MAXSIZE], SeqList* L,int i, int j) {
if (i < 0 || j < 0 || i >= MAXSIZE || j >= MAXSIZE||moved[i][j]==1)return false;
if ((i == MAXSIZE - 1) && (j == MAXSIZE - 1))return true;
if (maze[i][j] == '*')return false;
moved[i][j] = 1;
ListInsert(L, i, j);
if (RecursMaze(maze, moved,L, i-1, j))return true;
if (RecursMaze(maze, moved,L, i, j+1))return true;
if (RecursMaze(maze, moved,L, i+1, j))return true;
if (RecursMaze(maze, moved,L, i, j-1))return true;
ListDelete(L);
return false;
}
下載地址:
相關文章
- c++迷宮問題回溯法遞迴演算法C++遞迴演算法
- 用C語言解決迷宮問題C語言
- 回溯法求迷宮問題
- 回溯法解決迷宮問題
- C語言動態走迷宮C語言
- c語言_遞迴C語言遞迴
- (C++)資料結構實驗二——迷宮問題C++資料結構
- 發現C語言遞迴深度有限制C語言遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- 解密迷宮問題:三種高效演算法Java實現,讓你輕鬆穿越未知迷宮解密演算法Java
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- C語言 遞迴實現二叉排序樹的插入C語言遞迴排序
- POJ3984-迷宮問題
- 遞迴實現漢諾塔問題遞迴
- C#語言函式遞迴C#函式遞迴
- C++實現迷宮的生成與解決C++
- 寒假補充專案-回溯法走迷宮
- 華為優招面試題---迷宮問題面試題
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- C語言遞迴之母牛的故事C語言遞迴
- C++基於控制檯的迷宮實現(上)C++
- 迷宮問題【資料結構實驗報告】資料結構
- c語言實現貓吃老鼠的問題C語言
- 用C語言實現八數碼問題C語言
- C語言用遞迴方法求解階乘C語言遞迴
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- 爬臺階問題(遞迴和動態規劃實現)遞迴動態規劃
- C語言 DSF (尋求迷宮起點到終點的所有路徑)C語言
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- 迷宮問題——最短程式碼,不到70行
- C#實現FFT(遞迴法)C#FFT遞迴
- c#遞迴實現 階乘C#遞迴
- 程式設計中的遞迴(C語言為例)程式設計遞迴C語言
- ch2_8_3求解迴文序列問題(遞迴實現)遞迴
- 走迷宮
- 簡單介紹Python迷宮生成和迷宮破解演算法Python演算法