迷宫问题——深度优先算法(c语言实现)

本文介绍了使用深度优先算法解决迷宫问题的方法。通过建立二维数组表示迷宫,用0表示道路,1表示墙壁,并设定移动方向,依次检查上下左右四个方向。利用递归函数遍历所有可能的路径,并用一个数组记录已走过的路径,防止回溯。当找到终点时,会比较并更新最短步数。最后给出了具体的C语言实现代码。

大家好,这里是木子古月的学习日记

今天要学习的是迷宫问题,运用的是深度优先算法

废话不多说,我写一下我自己对这个算法的理解,以及问题解决的步骤

对于一个迷宫问题,首先我们要了解是题目

我下面就简单出一个题目

红色的代表起点和终点,黑色的代表可以走的路,白色为墙壁;

由此我们要去解决的是从起点到终点的最短路径问题:

因此我们开始逐步分析

  • 关于道路和墙壁如何识别的问题:可以建立一个二维数组用来存储墙壁和道路信息

比如定义一个数组  

int wall [5] [5];

我们在这里用0代表道路,1代表墙壁,提前读入道路信息;

  • 关于移动方向:首先我们移动方向一般只有 上、下、左、右 这四个方向,如果有斜向的方向另说,因此我们可以制定一个顺序,去依次访问这些方向的单元格(道路)。

这里我们制定的方向为:左 、 下 、 右 、 上。

可以写一个数组来记录路是否走过,以防止回头的现象出现

Int st [5] [5] ;

走过的话把相应的单元格(道路)改为1;

因此我们可以写一个部分去走四个方向的路:

左方向:

              st [x][y] = 1;

         if (wall[x+1][y] == 0 && st[x+1][y] == 0) {

             st[x+1][y] = 1;

             fun(x+1, y, step + 1);

             st[x+1][y] = 0;

下方向:

       

              st [x][y] = 1;

         if (wall[x+1][y] == 0 && st[x+1][y] == 0) {

             st[x+1][y] = 1;

             fun(x+1, y, step + 1);

             st[x+1][y] = 0;

左方向:

              st [x][y] = 1;

         if (wall[x-1][y] == 0 && st[x-1][y] == 0) {

             st[x-1][y] = 1;

             fun(x-1, y, step + 1);

             st[x-1][y] = 0;

上方向:

              st [x][y] = 1;

         if (wall[x][y-1] == 0 && st[x][y-1] == 0) {

             st[x][y-1] = 1;

             fun(x, y-1, step + 1);

             st[x][y-1] = 0;

我们也可以简化一下:

用一个循环的方法来实现这个步骤:

int kx[4] = { 1,0,-1,0 };

int ky[4] = { 0,1,0,-1 };



for (int k = 0; k < 4; k++) {

         int tx = x1 + kx[k];

         int ty = y1 + ky[k];

         st[x1][y1] = 1;

         if (wall[tx][ty] == 0 && st[tx][ty] == 0) {

             st[tx][ty] = 1;

             fun(tx, ty, step + 1);

             st[tx][ty] = 0;

         }

    }

这里不难理解就是把四个方向所要改变的X方向和Y方向的值记录在数组里面

不细说了。

然后我们要做的就是比较步数大小

这十分简单,我们只需要在开头写一个判断和返回就可以:

if (x1 == 29 && y1 == 49) {

         if (min < step)

             min = step;

         return;

}

到这里,我们就已经把步骤写完了:

下面就是实现函数具体代码,主函数可以根据自己的需要添加:

#include <stdio.h>
int  min;
int kx[4] = { 1,0,-1,0 };
int ky[4] = { 0,1,0,-1 };
int wall[5][5], st[5][5] = {0};
void fun(int x1, int y1,int step) {
	if (x1 == 4 && y1 == 4) {
		if (min < step)
			min = step;
		return;
	}
	for (int k = 0; k < 4; k++) {
		int tx = x1 + kx[k];
		int ty = y1 + ky[k];
		st[x1][y1] = 1;
		if (wall[tx][ty] == 0 && st[tx][ty] == 0) {
			st[tx][ty] = 1;
			fun(tx, ty, step + 1);
			st[tx][ty] = 0;
		}

	}
	return;
}
int main() {
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			scanf("%d",&wall[i][j]);
		}
	}
	fun(0,0,0);
	printf("%d", min);
}

深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树形结构(包括图)的算法。在C语言中,我们可以使用递归或栈数据结构来实现DFS。 **基本思想**: 1. 从根节点开始(如果有的话),选择一个未访问过的邻接节点并标记为已访问。 2. 对选中的节点进行处理(如打印节点值)。 3. 递归地对该节点的所有未访问邻接节点进行DFS。 4. 如果所有节点都已访问过,则返回上一层继续搜索,直到所有路径都被探索完。 **C语言实现(使用递归)**: ```c #include <stdio.h> #define MAX 100 // 树的最大节点数 // 假设adj[]是一个邻接列表表示的图,visited[]存储节点是否被访问过 void DFS(int node, int adj[], int visited[]) { visited[node] = 1; // 标记当前节点已被访问 printf("%d ", node); // 处理节点 for (int i = 0; i < MAX; i++) { // 遍历邻居 if (adj[node][i] && !visited[i]) { // 如果邻居未访问 DFS(i, adj, visited); // 递归访问邻居 } } } int main() { int graph[MAX][MAX]; // 图的邻接矩阵或者其他数据结构 int visited[MAX] = {0}; // 初始化所有节点为未访问 // 初始化图、设置起点等 DFS(0, graph, visited); return 0; } ``` **注意事项**: - 递归版本需要足够的栈空间来保存函数调用记录,如果图过大可能会导致栈溢出。 - 可以考虑使用非递归方法,通过队列实现广度优先搜索(BFS),但这将涉及额外的数据结构维护。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值