前言
学完图的数据结构,发现可以借助其遍历思想实现迷宫问题,遂用两种方法编写实现。
本文章仅展示头文件、测试文件以及递归函数的定义,鼓励大家开动脑筋,自行补充回溯算法。至于其他函数的实现,可以在文末下载。
题目背景
用n
m
的矩阵表述迷宫,位置(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;
}
下载地址:
版权声明:本文为great_beauty原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。