C++ bfs实现迷宫问题找最短路径 bilibli麦克老师讲算法


一、题意

从一个迷宫中找出起点到终点的最短的路径
第一行输入迷宫的大小
接下来输入迷宫各个方格的障碍情况1表示该方格上没有障碍物,2表示该方格上有障碍物
输入完迷宫各个方格的障碍物情况之后输入4个数据,前两个数据表示起点坐标,后两个数据表示终点的坐标。
然后显示起点到终点最少步数是多少
例如输入
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
//则输出
7

二、代码

1.代码的实现

代码如下(示例):

#include<bits/stdc++.h>
using namespace std;
int a[50][50],v[50][50];
struct point{
	int x;
	int y;
	int step;
};
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
queue<point> r;//申请队列 队列中元素的类型为尖括号里面的 队列名称为r  
//定义队列的模板是 queue<元素类型> 队列名称; 
int main()
{
	int n,m,startx,starty,p,q;//输入棋盘大小开始起点和终点
	cin>>n>>m;//n对应i m对应j 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	cin>>startx>>starty>>p>>q;
	
	
	//bfs 
	point start;
	start.x = startx;
	start.y = starty;
	start.step = 0;
	r.push(start);//将起点start入队 
	v[startx][starty]=1;//用来标记已经访问过的点 
	int flag = 0;//表示是否有可行路径 
	while(!r.empty())//如果队列不为空 
	{
		int x=r.front().x;
		int y=r.front().y;
		if(x==p && y==q)
		{
			flag = 1;//说明找到了终点 
			cout<<r.front().step;
			break;
		}
		for(int k=0;k<=3;k++)
		{
			int tx;
			int ty;
			tx = x+dx[k];
			ty = y+dy[k];
			if(a[tx][ty]==1 && v[tx][ty]==0)//如果a是空地,并且未访问过
			 {
			 	//入队 
			 	point temp;//新创建一个临时point结构体变量,然后把temp入队 
			 	temp.x = tx;
			 	temp.y = ty;
			 	temp.step = r.front().step + 1; 
			 	r.push(temp);
			 	v[tx][ty] = 1;//则设置为已经访问 
			 }
		}
		r.pop();//拓展完了需要将队首元素出队 
	} 
	if(flag==0)//找不到终点 
	{
		cout<<"没有答案";
	}
} 

2.读入数据

代码如下(示例):

5 4//表示迷宫的大小
1 1 2 1//1表示空地,2表示障碍物
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3//1,1表示起点的坐标	4,3表示终点的坐标
7//改行为输出的结果为7

//下面图片来自bilibili麦克老师讲算法
设当前点为x,y则要上下左右移动时需进行如图所示的计算方式
在这里插入图片描述

在这里插入图片描述


三、总结

bfs(广度优先搜索)求解思路:将队首节点和可以拓展的点入队,如果没有可以拓展的点,将队首节点出队,重复以上步骤,知道到达目标位置或者队列为空时。bfs搜索到的结果一定是最短的,bfs运用到了队列。

dfs(深度优先搜索)求解思路:从某点出发沿着一个方向往下试探,当找到目标位置时,还需回溯,以便于找到所有的路径,再比较最短的路径,比较盲目,效率低于bfs,dfs使用到了栈。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C代码实现bfs迷宫问题最短路径: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_ROW 10 #define MAX_COL 10 typedef struct { int row, col, parent; } Node; Node queue[MAX_ROW * MAX_COL]; int head = 0, tail = 0; char maze[MAX_ROW][MAX_COL+1] = { "#S######.#", "......#..#", ".#.##.##.#", ".#........", "##.##.####", "....#....#", ".######.#.", "........#.", ".#######.#", "....#...G#" }; const int dr[] = {-1, 0, 1, 0}; const int dc[] = {0, 1, 0, -1}; void enqueue(Node n) { queue[tail++] = n; } Node dequeue() { return queue[head++]; } bool is_empty() { return head == tail; } void print_path(Node n) { if (n.parent == -1) { printf("(%d, %d)\n", n.row, n.col); } else { print_path(queue[n.parent]); printf("(%d, %d)\n", n.row, n.col); } } void bfs() { Node start = {0, 1, -1}; enqueue(start); maze[start.row][start.col] = '#'; while (!is_empty()) { Node current = dequeue(); if (maze[current.row][current.col] == 'G') { print_path(current); return; } for (int i = 0; i < 4; i++) { int nr = current.row + dr[i]; int nc = current.col + dc[i]; if (nr < 0 || nc < 0 || nr >= MAX_ROW || nc >= MAX_COL) { continue; } if (maze[nr][nc] == '#' || maze[nr][nc] == 'S') { continue; } Node next = {nr, nc, head-1}; enqueue(next); maze[nr][nc] = '#'; } } } int main() { bfs(); return 0; } ``` 这个代码使用了一个队列来实现bfs。在每次循环中,它从队列中取出一个节点,检查它是否是终点(G),如果是,就打印路径并结束程序。否则,它会检查节点周围的四个邻居,如果邻居是可通行的,就将它们加入队列中。如果队列为空,就说明没有从起点到达终点的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值