回溯和递归实现迷宫问题(C语言)

  • Post author:
  • Post category:其他




前言

学完图的数据结构,发现可以借助其遍历思想实现迷宫问题,遂用两种方法编写实现。


本文章仅展示头文件、测试文件以及递归函数的定义,鼓励大家开动脑筋,自行补充回溯算法。至于其他函数的实现,可以在文末下载。




题目背景

用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;
}




下载地址:

链接:

https://github.com/clolrful/Maze-problem.git

.



版权声明:本文为great_beauty原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。