dfs bfs

文章介绍了如何用C语言实现深度优先搜索(DFS)和广度优先搜索(BFS)算法来找到起点到终点的最短路径。在DFS中,通过递归和回溯策略探索所有可能的路径;而在BFS中,利用队列存储节点并逐个处理,直到找到目标或遍历完所有可达节点。两种方法都涉及到地图的遍历和障碍物的判断,以及访问标记的管理。
摘要由CSDN通过智能技术生成

dfs

运用递归和回溯的方式来找到起点到终点的最短路径,比如从起点出发,我们就有4个位置可以出发

我们先从右边向下一直递归搜索可以走的路,直到到达终点或者碰到不能走的时候,我们就把这个地点的标记去除然后再回到上一个点来进行下一个方向,这样子一直递归回溯,然后设置一个递归出口为到达终点就ok

#include <stdio.h>
int p, q,min=99999999;
int a[100][100];//地图2表示障碍物 1表示空地
int v[100][100];//0表示为访问,1表示访问
void dfs(int x,int y,int step)
{
	if (x == p && q == y)
	{
		if (step < min) min == step;
		return;
	}
	//向右
	if (a[x][y + 1] == 1 && v[x][y + 1] == 0)
	{
		v[x][y + 1] == 1;
		dfs(x, y + 1,step+1);
		v[x][y + 1] = 0;
	}
	//向下
	if (a[x+1][y] == 1 && v[x + 1][y] == 0)
	{
		v[x + 1][y] == 1;
		dfs(x+1, y, step + 1);
		v[x + 1][y]] = 0;
	}
	//向左
	if (a[x][y-1] == 1 && v[x][y - 1] == 0)
	{
		v[x][y - 1] == 1;
		dfs(x, y-1, step + 1);
		v[x][y - 1] = 0;
	}
	//向上
	if (a[x - 1][y] == 1 && v[x - 1][y] == 0)
	{
		v[x - 1][y] == 1;
		dfs(x -1, y, step + 1);
		v[x - 1][y] = 0;
	}
	return;
}
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
void dfspuls(int x, int y, int step)
{
	if (x == p && q == y)
	{
		if (step < min) min == step;
		return;
	}
	for (k = 0; k < 4; k++)
	{
		if (a[x + dx[k]][y + dy[k]] == 1 && v[x + dx[k]][y + dy[k]] == 0)
		{
			v[x + dx[k]][y + dy[k]] == 1;
			dfs(x + dx[k], y + dy[k], step + 1);
			v[x + dx[k]][y + dy[k]] == 0;
		}
	}
	return;
}
int main()
{
	int x, y;
	scanf("%d%d%d%d", x, y,p,q);
	for (int i = 1; i <= x; i++)
	{
		for (int j = 1; j <= y; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	dfs(1, 1,0);
	printf("%d", min);
}

bfs

我们起点开始为0步数并把起点入队,然后再向4个方向走,每走一步加上1,并打上标记,然后我们再把这个起点上下左右四个方向都走一下并入队,和打上标记,然后再将队首出队,然后我们再走现在队首的元素,这样子一直循环下去,直到都被打上标记或者队内元素为0时退出循环,得到最短路径的步数

#include <stdio.h>
#include <queue>
struct node
{
	int x, y, step;
};
queue<node> r;
int map[100][100];
int v[100][100];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int main()
{
	int a, b;
	int starx, stary, n, m;
	scanf("%d%d", &a, &b);
	for (int i = 1; i <= a; i++)
	{
		for (int j = 1; j <= b; j++)
		{
			scanf("%d", &map[i][j]);
		}
	}
	scanf("%d%d%d%d", &starx, &stary, &n, &m);
	node star;
	star.x = starx;
	star.y = stary;
	star.step = 0;
	r.push(star);
	v[starx][stary] = 1;
	int flag = 0;
	while (!r.empty)
	{
		int x = r.front().x;
		int y = r.front().y;
		if (x == n && y == m)
		{
			flag = 1;
			printf("%d\n", r.front().step);
			break;
		}
		for (int k = 0; k < 4; k++)
		{
			int xx = x + dx[k], yy = y + dy[k];
			if (map[xx][yy] = 1 && v[xx][yy] = 0)
			{
				node teap;
				teap.x = xx;
				teap.y = yy;
				teap.step = r.front().step + 1;
				r.push(teap);
				v[xx][yy] = 1;
			}
		}
		r.pop();
	}
	if (flag == 0)
	{
		printf("没有可到达路径");
	}
}

这个是运用了c语言函数里面的queue,自己再手写队列的话太麻烦了,明天再把并查集和二叉树和二叉搜索树复习一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值