广度优先搜索(C语言实例)

本文通过一个二维数组的实例,介绍了如何利用广度优先搜索(BFS)解决路径问题。在有障碍物的坐标网格中,用1标识障碍,0表示通路。BFS算法借助队列进行搜索,按照从起点到终点的最短路径进行探索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们得到一个二维数组,这个为维数组就像当一个坐标一样,它的上边有障碍物(在有障碍物的地方我们用1来表示,没障碍物的地方用0来表示),使用广度优先搜索,我们就要用到队列,具体的思路就是如下伪代码

伪代码:
void BFS(Vertex V){    //从V这个顶点开始遍历
    visited[V]=true;    //先对V进行确认
    Enqueue(V,Q);    //将V压入队列中
    while(!IsEmpty){    
        V=Dequeue(Q);   //将队列中的弹出
        for(V的每一个邻接点W){
            if(!visted[w]){
 	            visted[w]=true;
                Enqueue(V,Q);   //将V压入队列中	
            }
       }
    }
}

这里使用实例来描述

#include<stdio.h>

struct note{
	int x;//横坐标 
	int y;//纵坐标 
	int f;//父在队列中的编号 
	int s;//步数 
};


int main(){
	struct note que[2501];//创建队列
	int a[51][51]={0},book[51][51]={0};
	//定义方向的数组
	int next[4][2]={
  {0,1},{1,0},{0,-1},{-1,0}};
	int head,tail;
	int i,j,m,n,startx,starty,p,q,tx,ty,flag;
	scanf("%d %d",&n,&m);
	
下面是一个使用C语言实现广度优先搜索的例子,用于寻找一个有向图中两个节点之间的最短路径: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 定义有向图节点的结构体 typedef struct node { int data; struct node* next; } Node; // 创建一个新的节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } // 添加一条从源节点到目标节点的边 void addEdge(Node* adjList[], int src, int dest) { Node* newNode = createNode(dest); newNode->next = adjList[src]; adjList[src] = newNode; } // 执行广度优先搜索 void BFS(Node* adjList[], int source, int dest, int numVertices) { bool visited[numVertices]; // 记录节点是否已经被访问过 int distance[numVertices]; // 记录每个节点到源节点的距离 int parent[numVertices]; // 记录每个节点在最短路径中的前一个节点 for (int i = 0; i < numVertices; i++) { visited[i] = false; distance[i] = -1; parent[i] = -1; } visited[source] = true; distance[source] = 0; Node* queue = createNode(source); // 创建一个队列来存储待访问的节点 while (queue != NULL) { int current = queue->data; // 取出队列头部的节点 queue = queue->next; Node* neighbor = adjList[current]; while (neighbor != NULL) { int next = neighbor->data; if (!visited[next]) { // 如果该节点还没有被访问过 visited[next] = true; distance[next] = distance[current] + 1; parent[next] = current; if (next == dest) { // 如果找到了目标节点,立即退出函数 printf("Shortest path length is %d\n", distance[dest]); printf("Path is: %d", dest); int p = parent[dest]; while (p != -1) { printf(" <- %d", p); p = parent[p]; } return; } Node* newNode = createNode(next); newNode->next = queue; queue = newNode; } neighbor = neighbor->next; } } printf("No path found between %d and %d\n", source, dest); } int main() { int numVertices = 6; Node* adjList[numVertices]; for (int i = 0; i < numVertices; i++) { adjList[i] = NULL; } addEdge(adjList, 0, 1); addEdge(adjList, 0, 2); addEdge(adjList, 1, 2); addEdge(adjList, 2, 3); addEdge(adjList, 3, 4); addEdge(adjList, 4, 1); addEdge(adjList, 4, 5); BFS(adjList, 0, 5, numVertices); return 0; } ``` 在上述例子中,我们使用了一个邻接表来表示有向图。邻接表是一个数组,其中每个元素都是一个链表,链表中存储了该节点可以到达的其他节点。 在BFS函数中,我们首先初始化了visited、distance和parent数组。我们将源节点的visited值设为true,distance值设为0,然后将源节点添加到队列中。接下来,我们开始遍历队列,每次取出队列头部的节点,并访问它的所有邻居节点。如果某个邻居节点还没有被访问过,我们将它的visited值设为true,将它的distance值设为当前节点的distance值加1,将它的parent值设为当前节点,然后将它添加到队列中。如果我们在访问某个邻居节点时发现它已经是目标节点了,那么我们就可以退出函数,输出最短路径长度和路径本身。 在本例中,我们使用邻接表来表示有向图。邻接表是一种空间效率比邻接矩阵更高的数据结构,特别适合表示稀疏图。在邻接表中,我们只为每个节点存储它可以到达的其他节点,而不是存储整个图的矩阵。这种方法使得我们可以用O(V+E)的时间复杂度来表示一个有V个节点和E条边的图,其中V是节点数,E是边数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值