期盼中求出起点到终点的最小步数

本文探讨了如何找到从起点到终点的最短路径问题,通过建立队列并逐步扩展节点,每次更新节点距离,直到终点被包含在内,以此求得最短步数。
摘要由CSDN通过智能技术生成
问题:
给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。
主要思路:

在这个问题中,找到从起点到终点的最短路径其实就是一个建立队列的过程:

1.从起点开始,先将其加入队列,设置距离为0;

2.从队列首端取出位置,将从这个位置能够到达的位置加入队列,并且让这些位置的距离为上一个位置的距离加上1;

3.循环2直到将终点添加到队列中,这说明我们已经找到了路径;


import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;


public class ShortLength {


static int len=1000000;
private void bfs(String[][] maxtrc,int [][]d,
无向网中起点终点的最短路径可以使用Dijkstra算法。 首先,需要定义一个结构体表示图中的一条边,包括起点终点和边权值: ```c typedef struct { int start; // 边的起点 int end; // 边的终点 int weight; // 边的权值 } Edge; ``` 接下来,可以定义一个二维数组`graph`表示图中各个节点之间的边权值,如果两个节点之间没有边,则边权值为无穷大。 ```c #define INF 0x3f3f3f3f // 表示无穷大 int graph[MAX_NODE][MAX_NODE]; // 图的邻接矩阵表示 ``` 然后,就可以使用Dijkstra算法起点终点的最短路径了。具体步骤如下: 1. 初始化距离数组`dist`和标记数组`visited`,将起点的距离设为0,其他节点的距离设为无穷大,标记数组初始全部为false。 ```c int dist[MAX_NODE]; // 起点到各个节点的距离 bool visited[MAX_NODE]; // 标记数组,表示节点是否已经访问过 void dijkstra(int start, int end, int n) { memset(visited, false, sizeof(visited)); for (int i = 0; i < n; i++) { dist[i] = graph[start][i]; } dist[start] = 0; } ``` 2. 从未标记的节点中选择距离起点最近的节点,并标记为已访问。 ```c int min_dist = INF; int u = start; for (int i = 0; i < n; i++) { if (!visited[i] && dist[i] < min_dist) { min_dist = dist[i]; u = i; } } visited[u] = true; ``` 3. 更新起点到相邻节点的距离,如果距离更小则更新距离数组`dist`。 ```c for (int v = 0; v < n; v++) { if (!visited[v] && graph[u][v] != INF) { if (dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } ``` 4. 重复步骤2和3,直到终点被标记为已访问或者所有未标记节点的距离为无穷大。 ```c while (!visited[end]) { // 选择距离起点最近的节点 int min_dist = INF; int u = start; for (int i = 0; i < n; i++) { if (!visited[i] && dist[i] < min_dist) { min_dist = dist[i]; u = i; } } visited[u] = true; // 更新起点到相邻节点的距离 for (int v = 0; v < n; v++) { if (!visited[v] && graph[u][v] != INF) { if (dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } } ``` 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值