基于C语言的广度优先搜索

合集下载

c语言中常用的查找

c语言中常用的查找

c语言中常用的查找C语言中常用的查找引言:在编程中,查找是一项非常常见且重要的操作。

无论是在数组、链表、树还是图等数据结构中,都需要进行查找操作来寻找特定的数据或者确定某个元素的存在与否。

C语言提供了多种查找算法和数据结构,本文将介绍C语言中常用的查找方法。

一、线性查找线性查找是最简单的查找方法之一,也称为顺序查找。

其基本思想是从数据集合的起始位置开始逐个比较待查找元素与集合中的元素,直到找到目标元素或者遍历完整个集合。

在C语言中,可以使用for循环或者while循环实现线性查找。

线性查找的时间复杂度为O(n),其中n为数据集合中元素的个数。

二、二分查找二分查找又称为折半查找,是一种高效的查找算法,但要求数据集合必须是有序的。

其基本思想是将数据集合分为两部分,然后通过与目标元素的比较来确定目标元素在哪个部分中,从而缩小查找范围。

重复这个过程直到找到目标元素或者确定目标元素不存在于数据集合中。

二分查找的时间复杂度为O(logn),其中n为数据集合中元素的个数。

三、哈希表查找哈希表是一种通过哈希函数将关键字映射到存储位置的数据结构,它能够以常数时间复杂度O(1)进行查找操作。

在C语言中,可以使用数组和链表的结合来实现哈希表。

哈希表的关键之处在于哈希函数的设计,良好的哈希函数能够将关键字均匀地映射到不同的存储位置,从而提高查找效率。

四、二叉搜索树查找二叉搜索树是一种常用的数据结构,它满足以下性质:对于任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。

在C语言中,可以使用指针和递归的方式来实现二叉搜索树。

通过比较目标值与当前节点的值,可以确定目标值位于左子树还是右子树中,从而缩小查找范围。

五、图的遍历在图的数据结构中,查找操作通常是指遍历操作。

图的遍历有两种方式:深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索通过递归的方式依次访问图中的每个节点,直到找到目标节点或者遍历完整个图。

c语言洪泛算法

c语言洪泛算法

c语言洪泛算法洪泛算法是一种常见的搜索算法,也称为广度优先搜索(BFS)。

它是一种用来遍历或搜索图形或树的算法,从一个起始节点开始,逐层地向外扩展,直到找到目标节点为止。

洪泛算法的基本思想是通过维护一个队列来实现。

首先,将起始节点放入队列中,然后不断从队列中取出节点,并将其未被访问过的邻居节点加入队列。

这样一层层地扩展,直到找到目标节点或者队列为空为止。

在实际应用中,洪泛算法有很多用途。

例如,在地图导航中,可以使用洪泛算法来找到从起点到终点的最短路径;在社交网络中,可以使用洪泛算法来寻找两个人之间的最短关系链;在迷宫游戏中,可以使用洪泛算法来找到从起点到终点的通路等等。

下面以一个迷宫游戏为例来说明洪泛算法的应用。

我们需要构建一个迷宫地图,可以使用二维数组表示。

其中,0表示墙壁,1表示通路,起点用S表示,终点用E表示。

接下来,我们需要实现洪泛算法的代码。

首先,我们定义一个队列,用来存储待访问的节点。

然后,将起点入队,并标记为已访问。

接着,开始循环,直到队列为空为止。

在每次循环中,取出队首节点,并找到它的所有邻居节点。

如果邻居节点未被访问过且是通路,则将其入队,并标记为已访问。

重复这个过程,直到找到终点或者队列为空。

我们可以根据访问记录来还原路径。

从终点开始,逆向遍历每个节点的访问记录,直到回到起点。

这样就得到了从起点到终点的最短路径。

洪泛算法的时间复杂度为O(V+E),其中V表示节点的数量,E表示边的数量。

在实际应用中,由于需要访问每个节点和其邻居节点,所以洪泛算法的时间复杂度通常是线性的。

洪泛算法的优点是简单易懂,适用于大多数图形或树的搜索问题。

然而,由于需要访问所有节点和边,所以在大规模图形中效率较低。

此外,洪泛算法没有考虑权重,无法解决带权重的最短路径问题。

洪泛算法是一种常见的搜索算法,广泛应用于图形和树的遍历和搜索问题。

它通过维护一个队列,逐层扩展,实现从起点到目标节点的搜索。

虽然洪泛算法简单易懂,但在大规模图形中效率较低,无法解决带权重的最短路径问题。

迪杰斯特拉算法c语言

迪杰斯特拉算法c语言

迪杰斯特拉算法c语言一、什么是迪杰斯特拉算法?迪杰斯特拉算法(Dijkstra algorithm)是一种用于解决图的最短路径问题的贪心算法。

它采用了广度优先搜索的策略,每次找到当前节点到其他所有节点中距离最短的一个节点,并将该节点加入到已访问的集合中,直到所有节点都被访问为止。

二、迪杰斯特拉算法的原理1. 初始化首先,我们需要对图进行初始化。

设定一个起点,并将该点距离源点的距离设置为0,其他点距离源点的距离设置为无穷大。

2. 找到最小距离接下来,我们需要从未访问过的节点中找到距离源点最近的一个节点。

这个过程可以通过建立一个优先队列来实现。

在每次找到最小值后,我们需要将该节点标记为已访问,并更新与该节点相邻的所有未访问过的节点的最小距离值。

3. 更新最短路径在更新与当前节点相邻的所有未访问过的节点之后,我们需要重新寻找未访问过的节点中距离源点最近的一个。

这个过程会不断重复直至所有节点都被访问过。

4. 输出结果当所有节点都被访问过之后,我们就可以得到从源点到其他所有节点的最短路径。

三、迪杰斯特拉算法的实现以下是一个使用C语言实现的简单示例代码:```c#define INF 1000000 // 定义无穷大int dist[MAX_VERTEX_NUM]; // 存储距离源点的距离int visited[MAX_VERTEX_NUM]; // 标记是否已访问过// 初始化图void init_graph(Graph G, int start) {for (int i = 0; i < G.vertex_num; i++) {dist[i] = INF;visited[i] = 0;}dist[start] = 0;}// 找到距离源点最近的节点int find_min(Graph G) {int min_dist = INF, min_index = -1;for (int i = 0; i < G.vertex_num; i++) {if (!visited[i] && dist[i] < min_dist) {min_dist = dist[i];min_index = i;}}return min_index;}// 更新与当前节点相邻的节点的最短距离值void update_dist(Graph G, int index) {for (EdgeNode* p = G.adj_list[index].first_edge; p != NULL; p= p->next_edge) {int v = p->adjvex;if (!visited[v] && dist[index] + p->weight < dist[v]) {dist[v] = dist[index] + p->weight;}}}// 迪杰斯特拉算法void dijkstra(Graph G, int start) {init_graph(G, start);for (int i = 0; i < G.vertex_num; i++) {int index = find_min(G);visited[index] = 1;update_dist(G, index);}}```四、迪杰斯特拉算法的应用迪杰斯特拉算法可以用于解决许多实际问题,如路由选择、网络优化等。

c语言常用算法集

c语言常用算法集

c语言常用算法集
以下是一些常用的C语言算法集合:
1. 排序算法:
- 冒泡排序(Bubble Sort)
- 选择排序(Selection Sort)
- 插入排序(Insertion Sort)
- 归并排序(Merge Sort)
- 快速排序(Quick Sort)
2. 搜索算法:
- 二分查找(Binary Search)
- 线性搜索(Linear Search)
3. 图算法:
- 深度优先搜索(Depth First Search, DFS)
- 广度优先搜索(Breadth First Search, BFS)
- 最短路径算法(例如:Dijkstra算法、Floyd-Warshall算法) - 最小生成树算法(例如:Prim算法、Kruskal算法)
4. 动态规划:
- 背包问题(Knapsack Problem)
- 最长公共子序列(Longest Common Subsequence)
- 最长递增子序列(Longest Increasing Subsequence)
5. 数学算法:
- 斐波那契数列(Fibonacci Sequence)
- 素数判断(Prime Number Check)
- 阶乘(Factorial)
- 快速幂算法(Fast Exponentiation)
这些算法只是常用的一部分,还有很多其他种类的算法。

掌握这些基本的算法可以帮助你更好地理解和解决各种问题。

C语言中的算法实现

C语言中的算法实现

C语言中的算法实现算法是计算机科学中非常重要的概念,它是解决问题的一系列步骤或指令集。

在C语言中,我们可以使用不同的方法来实现算法。

本文将介绍一些常见的C语言算法实现方式。

一、排序算法1. 冒泡排序冒泡排序是一种简单但效率较低的排序算法。

它通过不断比较相邻的元素,并按照规则交换它们的位置,直到整个序列排序完成。

2. 选择排序选择排序是一种简单而直观的排序算法。

它每次从未排序的序列中选择最小(或最大)的元素,并将其放置在已排序序列的末尾。

3. 插入排序插入排序是一种简单且高效的排序算法。

它通过构建有序序列,对未排序的元素逐个插入到已排序的序列中,直到所有元素都被插入完成。

二、查找算法1. 顺序查找顺序查找是一种简单的查找算法。

它从列表的开头开始逐个比较元素,直到找到目标元素或查找完整个列表。

2. 二分查找二分查找是一种高效的查找算法,但要求列表必须是有序的。

它通过将待查找区域分成两部分,判断目标元素落在哪一部分,从而缩小查找范围,直到找到目标元素或确定不存在。

三、递归算法递归是一种常用的算法设计技巧。

它通过在函数内调用自身来解决相同问题的不同实例。

在C语言中,递归函数需要定义出口条件,以避免无限递归。

四、动态规划算法动态规划是一种用于解决具有重叠子问题和最优子结构性质的问题的方法。

它将问题分解为一系列子问题,并以自底向上的方式求解子问题,最终得到整体问题的解。

在C语言中,可以使用循环、数组和指针等特性来实现动态规划算法,从而有效地解决问题。

五、图算法图是一种用于描述对象之间关系的数据结构,图算法是解决图相关问题的一类算法。

常见的图算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

六、字符串算法字符串算法用于处理字符串相关的问题,如字符串匹配、编辑距离等。

C语言提供了一系列字符串处理函数,如strlen、strcpy等,可以方便地实现字符串算法。

七、数学算法C语言在数学算法方面提供了丰富的库函数支持,如求平方根、对数、指数等。

栈和队列的应用——迷宫问题(深度、广度优先搜索)

栈和队列的应用——迷宫问题(深度、广度优先搜索)

栈和队列的应⽤——迷宫问题(深度、⼴度优先搜索)⼀、迷宫问题 给⼀个⼆维列表,表⽰迷宫(0表⽰通道,1表⽰围墙)。

给出算法,求⼀条⾛出迷宫的路径。

maze = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,0,0,1,1,0,0,1],[1,0,1,1,1,0,0,0,0,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,0,0,1],[1,0,1,1,1,0,1,1,0,1],[1,1,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1]] 1代表墙,0代表路,图⽰如下:⼆、栈——深度优先搜索 应⽤栈解决迷宫问题,叫做深度优先搜索(⼀条路⾛到⿊),也叫做回溯法。

1、⽤栈解决的思路 思路:从上⼀个节点开始,任意找下⼀个能⾛的点,当找不到能⾛的点时,退回上⼀个点寻找是否有其他⽅向的点。

使⽤栈存储当前路径。

后进先出,⽅便回退到上⼀个点。

2、⽤栈代码实现maze = [[1,1,1,1,1,1,1,1,1,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,1,0,0,0,1,0,1],[1,0,0,0,0,1,1,0,0,1],[1,0,1,1,1,0,0,0,0,1],[1,0,0,0,1,0,0,0,0,1],[1,0,1,0,0,0,1,0,0,1],[1,0,1,1,1,0,1,1,0,1],[1,1,0,0,0,0,0,0,0,1],[1,1,1,1,1,1,1,1,1,1]]# 四个移动⽅向dirs = [lambda x,y: (x+1, y), # 下lambda x,y: (x-1, y), # 上lambda x,y: (x, y-1), # 左lambda x,y: (x, y+1) # 右]def maze_path(x1, y1, x2, y2): # (x1,y1)代表起点;(x2,y2)代表终点stack = []stack.append((x1, y1))while(len(stack)>0):curNode = stack[-1] # 当前的节点(栈顶)if curNode[0] ==x2 and curNode[1] == y2: # 判断是否⾛到终点# ⾛到终点,遍历栈输出路线for p in stack:print(p)return True"""搜索四个⽅向"""for dir in dirs:nextNode = dir(curNode[0], curNode[1])# 如果下⼀个阶段能⾛if maze[nextNode[0]][nextNode[1]] == 0:stack.append(nextNode) # 将节点加⼊栈maze[nextNode[0]][nextNode[1]] = 2 # 将⾛过的这个节点标记为2表⽰已经⾛过了break # 找到⼀个能⾛的点就不再遍历四个⽅向else:# ⼀个都找不到,将该位置标记并该回退maze[nextNode[0]][nextNode[1]] = 2stack.pop()else:print("没有路")return Falsemaze_path(1,1,8,8)"""(1, 1) (2, 1) (3, 1) (4, 1) (5, 1) (5, 2) (5, 3) (6, 3) (6, 4)(6, 5) (7, 5) (8, 5) (8, 6) (8, 7) (8, 8)""" 总结算法就是:创建⼀个空栈,⾸先将⼊⼝位置进栈。

数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答

数据结构(c语言版)第三版习题解答数据结构(C语言版)第三版习题解答1. 栈(Stack)1.1 栈的基本操作栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作。

栈的基本操作有:(1)初始化栈(2)判断栈是否为空(3)将元素入栈(4)将栈顶元素出栈(5)获取栈顶元素但不出栈1.2 栈的实现栈可以使用数组或链表来实现。

以数组为例,声明一个栈结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储栈中的元素int top; // 栈顶指针} Stack;```1.3 栈的应用栈在计算机科学中有广泛的应用,例如计算表达式的值、实现函数调用等。

下面是一些常见的栈应用:(1)括号匹配:使用栈可以检查一个表达式中的括号是否匹配。

(2)中缀表达式转后缀表达式:栈可以帮助我们将中缀表达式转换为后缀表达式,便于计算。

(3)计算后缀表达式:使用栈可以方便地计算后缀表达式的值。

2. 队列(Queue)2.1 队列的基本操作队列是一种按照先进先出(FIFO)原则的线性表,常用的操作有:(1)初始化队列(2)判断队列是否为空(3)将元素入队(4)将队头元素出队(5)获取队头元素但不出队2.2 队列的实现队列的实现一般有循环数组和链表两种方式。

以循环数组为例,声明一个队列结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储队列中的元素int front; // 队头指针int rear; // 队尾指针} Queue;```2.3 队列的应用队列在计算机科学中也有广泛的应用,例如多线程任务调度、缓存管理等。

下面是一些常见的队列应用:(1)广度优先搜索:使用队列可以方便地实现广度优先搜索算法,用于解决图和树的遍历问题。

(2)生产者-消费者模型:队列可以用于实现生产者和消费者之间的数据传输,提高系统的并发性能。

广度优先搜索算法利用广度优先搜索解决的最短路径问题

广度优先搜索算法利用广度优先搜索解决的最短路径问题

广度优先搜索算法利用广度优先搜索解决的最短路径问题广度优先搜索算法(BFS)是一种图算法,用于解决最短路径问题。

其主要思想是从起始节点开始,不断扩展和访问其邻居节点,直到找到目标节点或者遍历完所有节点。

BFS算法可以用于解决许多问题,其中包括最短路径问题。

下面将介绍广度优先搜索算法的基本原理及其应用于最短路径问题的具体步骤。

同时,通过示例来进一步说明算法的执行过程和实际应用。

一、广度优先搜索算法原理广度优先搜索算法是一种层次遍历的算法,它从起始节点开始,按照距离递增的顺序,依次遍历节点。

在遍历的过程中,任意两个节点之间的距离不超过2,因此,BFS算法可以用于求解最短路径问题。

二、广度优先搜索算法的具体步骤1. 创建一个队列,用于存储待访问的节点。

2. 将起始节点放入队列中,并将其标记为已访问。

3. 当队列不为空时,执行以下步骤:a. 从队列中取出一个节点。

b. 访问该节点,并根据需求进行相应操作。

c. 将该节点的所有未访问过的邻居节点放入队列中,并将它们标记为已访问。

d. 重复步骤a~c,直到队列为空。

4. 完成以上步骤后,如果找到目标节点,则算法终止;否则,表示目标节点不可达。

三、广度优先搜索算法在最短路径问题中的应用最短路径问题是指从一个节点到另一个节点的最短路径,其长度可以通过广度优先搜索算法得到。

考虑以下示例:假设有一个迷宫,迷宫由多个格子组成,其中一些格子是墙壁,不可通过,而其他格子可以自由通行。

任务是找到从起始格子到达目标格子的最短路径。

利用广度优先搜索算法解决最短路径问题的具体步骤如下:1. 创建一个队列,并将起始格子放入队列中。

2. 将起始格子标记为已访问。

3. 当队列不为空时,执行以下步骤:a. 从队列中取出一个格子。

b. 如果该格子是目标格子,则算法终止。

c. 否则,获取该格子的邻居格子,并将未访问过的邻居格子放入队列中。

d. 将该格子的邻居格子标记为已访问。

e. 重复步骤a~d,直到队列为空。

图的深度广度优先遍历C语言程序

图的深度广度优先遍历C语言程序
printf("请输入顶点数目:");
scanf("%d",&L->num);
printf("请输入各顶点的信息(单个符号):");
for(i=0;i<L->num;i++)
{
fflush(stdin);
scanf("%c",&L->vexs[i]);
}
printf("请输入边权矩阵的信息:");
{ *e=sq.data[(sq.front)]; return 1;}
}
/*******************************************************************பைடு நூலகம்*********/
int QueueIn (SEQQUEUE *sq,DATATYPE x)
for(v2=0;v2<g.num;v2++)
{
if(g.arcs[v1][v2]!=0&&mark[v2]==0)
{
QueueIn(&q,v2);
mark[v2]=1;
printf("%c ",g.vexs[v2]);
}
}
//如果顺序循环队列sq为空,成功返回1,否则返回0
{
if (sq.rear==sq.front)
return(1);
else
return(0);
}
/*****************************************************************************/

C语言的六种常用算法

C语言的六种常用算法

C语言的六种常用算法C语言是一种非常流行的编程语言,广泛应用于各种领域中。

在C语言中,有许多常用的算法,可以用来解决各种问题。

下面我们将详细介绍C语言中的六种常用算法。

1.排序算法:排序算法可以将一组数据按照一定的规则进行排序。

常见的排序算法有冒泡排序、选择排序、插入排序、快速排序等。

这些排序算法的原理各有不同,但都可以实现对数据的排序。

排序算法对于处理大量数据的应用非常重要,可以提高查找、统计等操作的效率。

2.查找算法:查找算法是指在一组数据中寻找特定元素的过程。

常见的查找算法有线性查找、二分查找、哈希查找等。

这些算法的实现方式不同,但都可以高效地找到目标元素。

查找算法广泛应用于数据库查询、引擎等需要快速查找数据的场景中。

3.图算法:图算法是针对图结构进行的一系列操作。

图是由顶点和边组成的数据结构,可以用来表示各种关系。

在图算法中,常见的操作包括遍历、连通性判断、最短路径查找等。

图算法在网络分析、社交网络分析、运输规划等领域中有着广泛的应用。

4.动态规划算法:动态规划算法是一种解决多阶段决策问题的方法。

它将问题划分为若干个阶段,每个阶段都有一系列可选的决策。

通过求解每个阶段的最优决策,最终得到整个问题的最优解。

动态规划算法在最短路径问题、背包问题、序列比对等领域中有着重要的地位。

5.深度优先算法:深度优先算法是一种遍历图或树的方法。

它从一个起始节点开始,沿着一条路径尽可能远地,直到遇到死路才返回并尝试其他路径。

深度优先算法常用于解决迷宫问题、图的连通性判断等。

6.广度优先算法:广度优先算法是一种遍历图或树的方法。

它从一个起始节点开始,首先访问所有相邻节点,然后再访问它们的相邻节点,以此类推,直到遍历完所有节点。

广度优先算法常用于寻找最短路径、社交网络分析等。

以上就是C语言中的六种常用算法。

这些算法在各自的领域中有着广泛的应用,对于解决各种问题起到了重要的作用。

对于想要学习C语言的人来说,掌握这些算法是非常重要的一步。

C++算法-8.广度优先搜索

C++算法-8.广度优先搜索








int main() { int i,j; char s[100],ch; scanf("%d%d\n",&m,&n); for (i=0; i<=m-1;i++ ) for (j=0;j<=n-1;j++ ) bz[i][j]=1; //初始化 for (i=0;i<=m-1;i++) { gets(s); for (j=0;j<=n-1;j++) if (s[j]=='0') bz[i][j]=0; } for (i=0;i<=m-1;i++) for (j=0;j<=n-1;j++) if (bz[i][j]) doit(i,j); //在矩阵中寻找细胞 printf("NUMBER of cells=%d",num); return 0; }







void doit() { int head,tail,i; head=0;tail=1; //队首为0、队尾为1 a[1]=1; //记录经过的城市 b[1]=0; //记录前趋城市 s[1]=1; //表示该城市已经到过 do //步骤2 { head++; //队首加一,出队 for (i=1;i<=8;i++) //搜索可直通的城市 if ((ju[a[head]][i]==0)&&(s[i]==0)) //判断城市是否走过 { tail++; //队尾加一,入队 a[tail]=i; b[tail]=head; s[i]=1; if (i==8) { out(tail);head=tail;break; //第一次搜到H城市时路线最短 } } }while (head<tail); } int main() //主程序 { memset(s,false,sizeof(s)); doit(); //进行Bfs操作 return 0; }

C语言经典算法大全精选

C语言经典算法大全精选

C语言经典算法大全精选1.排序算法1.1冒泡排序:通过不断交换相邻元素的位置,将最大(最小)值“冒泡”到序列的末尾(开头)。

1.2插入排序:将未排序的元素逐个插入已排序的序列中,保持序列始终有序。

1.3选择排序:每次从未排序的元素中选择最小(最大)的元素,放到已排序序列的末尾(开头)。

1.4快速排序:通过递归地将序列分割为较小和较大的两部分,然后分别对两部分进行排序。

1.5归并排序:将序列递归地分割为两个子序列,分别排序后再将结果合并。

1.6堆排序:构建最大(最小)堆,然后逐步将堆顶元素与最后一个元素交换,并调整堆结构。

2.查找算法2.1顺序查找:逐个比较元素,直到找到目标元素或遍历完整个序列。

2.2二分查找:在有序序列中,通过不断缩小查找范围,找到目标元素。

2.3插值查找:根据目标元素与序列中最大、最小元素的关系,按比例选择查找范围。

2.4哈希查找:利用哈希函数将目标元素映射到一个唯一的位置,从而快速定位目标元素。

3.字符串算法3.1字符串匹配算法:在文本串中查找给定的模式串,并返回匹配位置。

3.2字符串翻转:将一个字符串逆序输出。

3.3字符串压缩:将连续出现多次的字符压缩为一个字符,并输出压缩后的字符串。

3.4字符串拆分:按照指定的分隔符将字符串拆分为多个子串,并返回子串列表。

3.5字符串反转单词:将一个句子中的单词顺序逆序输出。

4.图算法4.1深度优先:从起始顶点出发,递归地访问所有能到达的未访问顶点。

4.2广度优先:从起始顶点出发,逐层地访问与当前层相邻的未访问顶点。

4.3最小生成树:找到连接所有顶点的具有最小权值的无环边集合。

4.4最短路径:找到两个顶点之间最短路径的权值和。

4.5拓扑排序:找到一个顶点的线性序列,满足所有有向边的起点在终点之前。

5.数学算法5.1质数判断:判断一个数是否为质数(只能被1和自身整除)。

5.2求最大公约数:找到两个数的最大公约数。

5.3求最小公倍数:找到两个数的最小公倍数。

c语言经典算法题

c语言经典算法题

c语言经典算法题
C语言经典算法题目涵盖了多个领域,包括排序、查找、递归、动态规划等。

以下是一些经典的C语言算法题目,它们对于提高编程能力和理解算法思想都是很有帮助的:
1. 冒泡排序:
实现冒泡排序算法,对一个数组进行升序或降序排序。

2. 快速排序:
实现快速排序算法,对一个数组进行升序或降序排序。

3. 选择排序:
实现选择排序算法,对一个数组进行升序或降序排序。

4. 二分查找:
实现二分查找算法,在有序数组中查找一个特定的元素。

5. 递归:
编写一个递归函数,计算斐波那契数列的第n 个数字。

6. 动态规划:
解决经典的动态规划问题,比如背包问题、最长公共子序列等。

7. 链表反转:
反转一个单链表或双链表。

8. 树的遍历:
实现二叉树的前序、中序和后序遍历。

9. 图的深度优先搜索(DFS)和广度优先搜索(BFS):
实现图的深度优先搜索和广度优先搜索算法。

10. 最短路径算法:
实现Dijkstra算法或Floyd-Warshall算法来求解图中的最短路径。

11. 素数判断:
编写一个函数判断一个给定的数是否是素数。

12. 最大公约数和最小公倍数:
实现求两个数的最大公约数和最小公倍数的算法。

这些题目旨在帮助你熟悉常见的算法思想和数据结构,提高编程和问题求解的能力。

解决这些题目时,不仅要注重正确性,还要考虑算法的效率和优化。

马的遍历问题c语言

马的遍历问题c语言

马的遍历问题c语言马的遍历问题是一道经典的算法问题,也是计算机科学中常见的图论问题。

在这个问题中,我们需要找到一种方法来让一个马在一个棋盘上遍历所有的格子,且每个格子只能被访问一次。

这个问题可以使用深度优先搜索或广度优先搜索等算法来解决。

一、问题描述1.1 题目描述在一个8x8的棋盘上,有一个马初始位置为(x0,y0),现在需要将马移动到棋盘上所有格子恰好经过一次且仅经过一次。

请问是否存在这样的移动方案?如果存在,请输出任意一种方案。

1.2 输入输出格式输入格式:两个整数x0和y0表示马初始位置坐标。

输出格式:若存在移动方案,则输出任意一种方案;否则输出“无解”。

二、解题思路2.1 深度优先搜索算法深度优先搜索算法是从根节点开始,沿着树的深度遍历树的节点,直到找到目标节点或者遍历完整棵树。

该算法可以使用递归方式实现,也可以使用栈来实现。

对于本题,在每个节点上,我们需要判断当前位置是否已经被访问过,并且还需要判断当前位置是否越界。

如果当前位置符合要求,则将该位置标记为已访问,并且继续递归搜索下一个节点。

如果搜索到最后一个节点,则说明找到了一种方案。

2.2 广度优先搜索算法广度优先搜索算法是从起始节点开始,按照层次遍历树的节点,直到找到目标节点或者遍历完整棵树。

该算法可以使用队列来实现。

对于本题,在每个节点上,我们需要判断当前位置是否已经被访问过,并且还需要判断当前位置是否越界。

如果当前位置符合要求,则将该位置标记为已访问,并且将该节点加入队列中。

接着从队列中取出下一个节点,继续搜索下一层的所有节点。

如果搜索到最后一个节点,则说明找到了一种方案。

三、代码实现3.1 深度优先搜索算法代码实现```#include <stdio.h>#include <stdlib.h>#define N 8 // 棋盘大小#define MAX_STEP N*N // 最大步数int board[N][N]; // 棋盘int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1}; // 马可以走的8个方向int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};void print_board() // 打印棋盘{int i, j;for(i=0; i<N; i++) {for(j=0; j<N; j++) {printf("%d ", board[i][j]);}printf("\n");}}int dfs(int x, int y, int step) // 深度优先搜索{int k, nx, ny;if(step == MAX_STEP) { // 找到一种方案print_board();return 1;}for(k=0; k<8; k++) { // 枚举马可以走的8个方向nx = x + dx[k];ny = y + dy[k];if(nx>=0 && nx<N && ny>=0 && ny<N && board[nx][ny]==0) { // 判断是否越界和是否已经访问过 board[nx][ny] = step+1;if(dfs(nx, ny, step+1)) { // 递归搜索下一个节点 return 1;}board[nx][ny] = 0;}}return 0;}int main(){int x, y;printf("请输入马初始位置坐标(范围:0~7):\n"); scanf("%d %d", &x, &y);if(x<0 || x>=N || y<0 || y>=N) {printf("输入坐标不合法!\n");return -1;}board[x][y] = 1; // 标记初始位置已访问过if(!dfs(x, y, 1)) { // 搜索所有节点printf("无解!\n");}return 0;}```3.2 广度优先搜索算法代码实现```#include <stdio.h>#include <stdlib.h>#define N 8 // 棋盘大小#define MAX_STEP N*N // 最大步数int board[N][N]; // 棋盘int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1}; // 马可以走的8个方向int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};void print_board() // 打印棋盘{int i, j;for(i=0; i<N; i++) {for(j=0; j<N; j++) {printf("%d ", board[i][j]);}printf("\n");}}int bfs(int x0, int y0) // 广度优先搜索{int queue[N*N][3];int head = 0;int tail = 0;int i;queue[tail][0] = x0;queue[tail][1] = y0;queue[tail][2] = 1; // 初始位置已访问过tail++;while(head<tail) { // 遍历队列中的所有节点int x = queue[head][0];int y = queue[head][1];int step = queue[head][2];if(step == MAX_STEP) { // 找到一种方案print_board();return 1;}for(i=0; i<8; i++) { // 枚举马可以走的8个方向int nx = x + dx[i];int ny = y + dy[i];if(nx>=0 && nx<N && ny>=0 && ny<N && board[nx][ny]==0) { // 判断是否越界和是否已经访问过 board[nx][ny] = step+1;queue[tail][0] = nx;queue[tail][1] = ny;queue[tail][2] = step+1;tail++;}}head++;}return 0;}int main(){int x, y;printf("请输入马初始位置坐标(范围:0~7):\n"); scanf("%d %d", &x, &y);if(x<0 || x>=N || y<0 || y>=N) {printf("输入坐标不合法!\n");return -1;}board[x][y] = 1; // 标记初始位置已访问过if(!bfs(x, y)) { // 搜索所有节点printf("无解!\n");}return 0;}```四、总结本文介绍了马的遍历问题,包括问题描述、解题思路和代码实现。

c语言dfs函数

c语言dfs函数

c语言dfs函数DFS(Depth First Search)是图遍历的一种算法,它以深度优先的方式进行搜索。

在计算机科学中,图是由节点(顶点)和连接节点的边组成的抽象数据类型。

DFS算法通过递归的方式遍历图中的节点,并记录已经访问过的节点,以避免重复访问。

在DFS算法中,首先选择一个起始节点作为根节点,然后从该节点开始向下遍历,直到达到最深的节点。

在遍历的过程中,如果遇到已经访问过的节点或者无法继续向下遍历的节点,则回溯到上一个节点,继续遍历其他路径。

这种遍历方式可以通过递归或者栈来实现。

DFS算法的核心思想是尽可能深入地探索图中的路径,直到找到目标节点或者无法继续深入为止。

它与BFS(Breadth First Search)算法相对应,BFS算法是以广度优先的方式进行搜索,先遍历当前节点的所有相邻节点,再依次遍历下一层的节点。

在实际应用中,DFS算法被广泛应用于解决各种问题,如寻找图中的连通分量、解决迷宫问题、生成括号序列等。

以下是几个应用DFS算法的具体例子:1. 寻找图中的连通分量:通过DFS算法可以遍历图中的所有节点,并将属于同一个连通分量的节点标记为已访问。

这样可以快速找到图中的所有连通分量,用于分析网络结构、社交关系等。

2. 解决迷宫问题:迷宫问题可以看作是一个由节点和连接节点的边构成的图。

通过DFS算法可以从起始节点开始遍历迷宫,直到找到终点或者无法继续深入为止。

这种方式可以找到从起点到终点的最短路径。

3. 生成括号序列:给定一个整数n,表示括号的对数,通过DFS算法可以生成所有有效的括号序列。

在生成序列的过程中,需要满足左括号的数量不能超过n,右括号的数量不能超过左括号的数量,这样才能保证生成的序列是有效的。

除了上述几个例子,DFS算法还可以应用于解决其他问题,如求解图的最小生成树、求解图的割点和桥等。

在实际应用中,选择使用DFS算法还是BFS算法取决于具体的问题需求和图的结构。

深度优先搜索和广度优先搜索的比较和应用场景

深度优先搜索和广度优先搜索的比较和应用场景

深度优先搜索和广度优先搜索的比较和应用场景在计算机科学中,深度优先搜索(DFS)和广度优先搜索(BFS)是两种常用的图搜索算法。

它们在解决许多问题时都能够发挥重要作用,但在不同的情况下具有不同的优势和适用性。

本文将对深度优先搜索和广度优先搜索进行比较和分析,并讨论它们在不同应用场景中的使用。

一、深度优先搜索(DFS)深度优先搜索是一种通过遍历图的深度节点来查找目标节点的算法。

它的基本思想是从起始节点开始,依次遍历该节点的相邻节点,直到到达目标节点或者无法继续搜索为止。

如果当前节点有未被访问的相邻节点,则选择其中一个作为下一个节点继续进行深度搜索;如果当前节点没有未被访问的相邻节点,则回溯到上一个节点,并选择其未被访问的相邻节点进行搜索。

深度优先搜索的主要优势是其在搜索树的深度方向上进行,能够快速达到目标节点。

它通常使用递归或栈数据结构来实现,代码实现相对简单。

深度优先搜索适用于以下情况:1. 图中的路径问题:深度优先搜索能够在图中找到一条路径是否存在。

2. 拓扑排序问题:深度优先搜索能够对有向无环图进行拓扑排序,找到图中节点的一个线性排序。

3. 连通性问题:深度优先搜索能够判断图中的连通分量数量以及它们的具体节点组合。

二、广度优先搜索(BFS)广度优先搜索是一种通过遍历图的广度节点来查找目标节点的算法。

它的基本思想是从起始节点开始,先遍历起始节点的所有相邻节点,然后再遍历相邻节点的相邻节点,以此类推,直到到达目标节点或者无法继续搜索为止。

广度优先搜索通常使用队列数据结构来实现。

广度优先搜索的主要优势是其在搜索树的广度方向上进行,能够逐层地搜索目标节点所在的路径。

它逐层扩展搜索,直到找到目标节点或者遍历完整个图。

广度优先搜索适用于以下情况:1. 最短路径问题:广度优先搜索能够在无权图中找到起始节点到目标节点的最短路径。

2. 网络分析问题:广度优先搜索能够在图中查找节点的邻居节点、度数或者群组。

三、深度优先搜索和广度优先搜索的比较深度优先搜索和广度优先搜索在以下方面有所不同:1. 搜索顺序:深度优先搜索按照深度优先的顺序进行搜索,而广度优先搜索按照广度优先的顺序进行搜索。

广度优先搜索算法

广度优先搜索算法

广度优先搜索算法广度优先搜索算法是一种常用的图搜索算法,其核心思想是从给定的图中找出所有可达到的节点,且按照距离源节点的距离依次访问。

本文将简要介绍广度优先搜索算法的原理及其在实际应用中的使用。

一、算法原理广度优先搜索算法使用队列来辅助实现。

首先,将起始节点加入队列中,并将其标记为已访问。

然后,以队列为基础进行迭代,每次取出队列的头部元素,并访问其相邻节点。

若该节点未被访问过,则将其加入队列末尾,并标记为已访问。

如此反复,直到队列为空,即完成了对图中所有可达节点的搜索。

二、算法应用1. 图的遍历广度优先搜索算法可以应用于图的遍历问题。

通过遍历整个图,可以找到图中所有节点,并按照一定的顺序进行访问。

这在路径搜索、网络分析等领域具有重要的应用价值。

2. 最短路径问题广度优先搜索算法可以解决带权图中的最短路径问题。

通过记录距离源节点的距离,并在扩展节点时更新距离值,可以找到源节点到目标节点的最短路径。

这在地图导航、网络路由等领域得到广泛应用。

3. 连通性检测广度优先搜索算法可以用于检测图中的连通性。

通过从一个节点开始进行广度优先搜索,若最终访问到的节点数量等于图中的节点总数,则说明图是连通的;否则,图是不连通的。

这对于网络拓扑分析、社交网络分析等具有重要意义。

三、算法优势广度优先搜索算法具有以下几个优势:1. 算法的鲁棒性强:广度优先搜索算法不受图中路径的选择和权重的影响,能够找到图中的所有可达节点。

2. 算法的可预测性好:广度优先搜索算法访问节点的顺序是可预测的,从而有效地进行路径规划和决策。

3. 算法的时间复杂度低:在保证搜索所有节点的前提下,广度优先搜索算法具有较低的时间复杂度,能够高效地完成搜索任务。

四、算法实现步骤广度优先搜索算法的实现步骤如下:1. 创建一个队列,并将起始节点加入队列中。

2. 标记起始节点为已访问。

3. 当队列不为空时,执行以下步骤:- 取出队列的头部元素,并访问该节点。

- 遍历该节点的相邻节点,若某个相邻节点未被访问过,则将其加入队列末尾,并标记为已访问。

c语言十大算法案例

c语言十大算法案例

c语言十大算法案例C语言是一种广泛应用于编程的高级语言,具有简单、灵活、高效等特点。

在C语言中,有许多经典的算法案例,这些算法案例不仅有助于提高编程能力,还能帮助我们理解计算机科学的基本原理。

下面列举了十个C语言的经典算法案例。

1. 冒泡排序算法:冒泡排序是一种简单但效率较低的排序算法,它通过多次比较和交换相邻元素的方式将最大或最小的元素逐步移动到数组的一端。

2. 快速排序算法:快速排序是一种常用的排序算法,它通过选择一个基准元素,将数组分成两个子数组,然后对子数组进行递归排序。

3. 二分查找算法:二分查找是一种高效的查找算法,它通过将查找范围缩小一半来快速定位目标元素。

4. 链表反转算法:链表反转是一种常见的操作,它可以将链表中的节点顺序逆转。

5. 汉诺塔算法:汉诺塔是一种经典的递归问题,它通过将圆盘从一个柱子移动到另一个柱子来演示递归的思想。

6. 最大公约数算法:最大公约数是指能够同时被两个或多个整数整除的最大正整数,求最大公约数的算法有多种,如辗转相除法和欧几里德算法。

7. 斐波那契数列算法:斐波那契数列是一个数列,其中每个数字都是前两个数字之和,求斐波那契数列的算法有多种,如递归和循环。

8. 图的深度优先搜索算法:深度优先搜索是一种用于遍历图的算法,它通过递归的方式依次访问图中的每个节点。

9. 图的广度优先搜索算法:广度优先搜索也是一种用于遍历图的算法,它通过队列的方式依次访问图中的每个节点。

10. 最短路径算法:最短路径算法用于找到图中两个节点之间的最短路径,常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。

这些算法案例涵盖了排序、查找、链表操作、递归、图算法等多个方面,是C语言学习中不可或缺的部分。

通过学习和理解这些经典算法案例,我们可以提高自己的编程能力,并在解决实际问题时能够选择合适的算法。

希望本文能够对读者有所帮助,激发他们对C 语言算法的兴趣,并在编程的道路上不断进步。

深度优先算法和广度优先算法c语言

深度优先算法和广度优先算法c语言

深度优先算法和广度优先算法是计算机科学中常见的两种图遍历算法。

它们在处理图数据结构时起着至关重要的作用,在实际应用中被广泛使用。

本文将探讨深度优先算法和广度优先算法在C语言中的实现和应用。

一、深度优先算法深度优先算法(Depth First Search)是一种用于遍历或搜索树或图的算法。

其基本思想是从起始顶点开始,尽可能沿着一条路径一直向下,直到无法再继续为止,然后回溯到前一个节点,继续向下搜索。

深度优先算法可以通过递归或栈来实现。

在C语言中,我们可以使用递归方法来实现深度优先算法。

```c#define MAXVEX 100typedef struct {int vertex[MAXVEX]; // 顶点表int arc[MAXVEX][MAXVEX]; // 邻接矩阵int vexnum, aum; // 图的顶点数和边数} MGraph;int visited[MAXVEX]; // 访问标志数组void DFS(MGraph G, int v) {int i;visited[v] = 1; // 标记v已访问printf("d ", v); // 访问顶点vfor (i = 0; i < G.vexnum; i++) {if (G.arc[v][i] == 1 !visited[i]) {DFS(G, i); // 对v的尚未访问的邻接顶点i进行递归访问}}}```二、广度优先算法广度优先算法(Breadth First Search)同样是一种用于图的遍历或搜索的算法,不同于深度优先算法,广度优先算法的基本思想是从起始顶点开始,先访问其所有的直接邻接顶点,然后依次访问这些邻接顶点的邻接顶点。

广度优先算法可以通过队列来实现。

在C语言中,我们可以使用队列来实现广度优先算法。

```ctypedef struct {int vertex[MAXVEX]; // 顶点表int arc[MAXVEX][MAXVEX]; // 邻接矩阵 int vexnum, aum; // 图的顶点数和边数} MGraph;int visited[MAXVEX]; // 访问标志数组void BFS(MGraph G, int v) {int i, j;int queue[MAXVEX]; // 定义队列int front = 0, rear = 0; // 队头和队尾指针 printf("d ", v); // 访问顶点vvisited[v] = 1; // 标记v已访问queue[rear++] = v; // 入队while (front < rear) {v = queue[front++]; // 出队for (i = 0; i < G.vexnum; i++) {if (G.arc[v][i] == 1 !visited[i]) {printf("d ", i); // 访问顶点ivisited[i] = 1; // 标记i已访问queue[rear++] = i; // 入队}}}}```三、深度优先算法与广度优先算法的比较1. 时间复杂度:深度优先算法和广度优先算法的时间复杂度均为O(V+E),其中V为顶点数,E为边数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于C语言的广度优先搜素算法的实现1.算法说明广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:(1)把根节点放到队列的末尾。

(2)每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。

并把这个元素记为它下一级元素的前驱。

(3)找到所要找的元素时结束程序。

(4)如果遍历整个树还没有找到,结束程序。

本次算法的应用中,我用这个队列来保存最短路径。

首先我定义队列为“真进假出”,所谓“真进”就是当添加一个元素时,把元素放置队尾,然后rear++,而“假出”就是当删除一个元素时,并没有真的删除队首元素,只是front++。

通过比较搜索所得的所有可行路径的长度,这样我们就可以从队列中获取一条最短路径!2.代码及结果#include<stdio.h>#define N 20typedef struct{int x;int y;}Node;/*队ï元a素?类え?型í*/typedef struct{int parent; /*双?亲×的?序î号?*/int child; /*双?亲×的?序î号?*/Node childpos; /*孩¢子哩?的?坐?标括?/}QType;int Maze[N][N] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,1,0,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};int visited[N][N] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,1,0,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};QType Q[N * N];int front = 0,rear = 0; /*队ï列 头 ?指?针?和í尾2指?针?*//************************************************************************************** *************************************//*获?取?下?一?个?邻ⅷ?接ï点?*//************************************************************************************** *************************************/int GetNextPos(int *i ,int *j,int count) // i行D j列{switch(count){case 1:(*j)++; //rightreturn 1;case 2:(*i)++; //downreturn 1;case 3:(*j)--; //leftreturn 1;case 4:(*i)--; //upreturn 1;default:return 0;}}/************************************************************************************** *************************************//*入?队ï*//************************************************************************************** *************************************/void EnQueue(int i,int j,int k){Q[rear].childpos.x = i;Q[rear].childpos.y = j; /*孩¢子哩?位?置?*/Q[rear].parent = k; /*双?亲×序î号?*/Q[rear].child = rear; /*孩¢子哩?序î号?*/rear++;}/************************************************************************************** *************************************//*出?队ï*//************************************************************************************** *************************************/void DeQueue(int *i,int *j,int *k){*i = Q[front].childpos.x;*j = Q[front].childpos.y;*k = Q[front].child;front++;}/************************************************************************************** *************************************//*通 ?过y广?度è优?先è遍括?历え?求ï最?短ì路·径?*//************************************************************************************** *************************************/void ShortestPath_BFS(){int i,j,k,count,n,m;EnQueue(1,1,-1); visited[1][1] = 1; /*起e点?入?队ï*/while(1){count = 1;DeQueue(&i,&j,&k);n = i,m = j; //保馈?存?当獭?前°位?置?while(GetNextPos(&i,&j,count)){count++;if(! visited[i][j]){EnQueue(i,j,k); visited[i][j] = 1;if(i == N-2 && j ==N-2) /*到?达?终?点?*/return;}i = n; j = m;}}}/************************************************************************************** *************************************//*输?出?*//************************************************************************************** *************************************/void OutPut(){int i,j,k;/*输?出?原-始?迷?宫?*/puts("原-始?迷?宫?...");for(i = 0;i < N;i++){for(j = 0;j < N;j++)printf("%d ",Maze[i][j]);printf("\n");}/*为a最?短ì路·径?着?色?*/k = rear - 1;while(k != -1){i = Q[k].childpos.x; j = Q[k].childpos.y;Maze[i][j] = 5;k = Q[k].parent;}/*输?出?最?短ì路·径?*/puts("最?短ì路·径?...");for(i = 0;i < N;i++){for(j = 0;j < N;j++)printf("%d ",Maze[i][j]);printf("\n");}}int main(void){ShortestPath_BFS();OutPut();getchar();return0;}说明:在这里我定义一个20*20的原始迷宫,1点代表障碍,0点代表空。

相关文档
最新文档