回溯和遞迴實現迷宮問題(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語言遞迴
- leetcode題解(遞迴和回溯法)LeetCode遞迴
- 迷宮問題
- C語言 遞迴實現二叉排序樹的插入C語言遞迴排序
- (C++)資料結構實驗二——迷宮問題C++資料結構
- C#語言函式遞迴C#函式遞迴
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- C語言遞迴之母牛的故事C語言遞迴
- 解密迷宮問題:三種高效演算法Java實現,讓你輕鬆穿越未知迷宮解密演算法Java
- 遞迴加回溯遞迴
- c語言實現貓吃老鼠的問題C語言
- POJ3984-迷宮問題
- C++實現迷宮的生成與解決C++
- 遞迴與回溯法遞迴
- 遞迴回溯相關遞迴
- POJ3984 迷宮問題【BFS】
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- 遞迴問題遞迴
- c#遞迴實現 階乘C#遞迴
- C#實現FFT(遞迴法)C#FFT遞迴
- C語言 DSF (尋求迷宮起點到終點的所有路徑)C語言
- 程式設計中的遞迴(C語言為例)程式設計遞迴C語言
- ch2_8_3求解迴文序列問題(遞迴實現)遞迴
- 主元素問題(C語言)C語言
- 第七章 遞迴、DFS、剪枝、回溯等問題 ------------- 7.3 題解:機器人走方格問題遞迴機器人
- 【資料結構】迴圈佇列 C語言實現資料結構佇列C語言
- GO語言————6.6 遞迴函式Go遞迴函式
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- 洛谷 p1605 迷宮問題 詳解
- 迷宮問題——最短程式碼,不到70行
- 基於C語言用遞迴思想實現斐波那契數列的函式設計C語言遞迴函式
- 演算法-一步步教你如何用c語言實現堆排序(非遞迴)演算法C語言排序遞迴
- 關於遞迴和回溯的一次深入思考遞迴
- C語言解決排序問題C語言排序