C++程序 矩阵或网格中两个单元格之间的最短距离

C++程序 矩阵或网格中两个单元格之间的最短距离

1. 简介

在很多应用场景中,需要计算矩阵或网格中两个单元格之间的最短距离,例如在电子游戏中,角色需要找到最短路径来到达目的地。本文将介绍如何用C++来实现这一功能。

2. 解决方案

我们可以使用BFS(Breadth-First Search)算法来解决这个问题。具体来讲,我们可以看作是在一个有向图中寻找从起点到终点的最短路径。当图中每个边的权值都相同时,BFS算法能够保证找到的路径是最短路径。

下面是一个简单的BFS算法实现,用于计算从起点到终点的最短路径:

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

const int MAXN = 100;
int grid[MAXN][MAXN];
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int shortestPath(int sx, int sy, int ex, int ey, int n, int m) {
    queue<pair<int, int>> q;
    int dist[n][m];
    memset(dist, -1, sizeof(dist));
    q.push(make_pair(sx, sy));
    dist[sx][sy] = 0;
    while (!q.empty()) {
        pair<int, int> u = q.front();
        q.pop();
        int x = u.first, y = u.second;
        if (x == ex && y == ey) return dist[ex][ey];
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && nx < n && ny >= 0 && ny < m && dist[nx][ny] == -1 && grid[nx][ny] == 0) {
                dist[nx][ny] = dist[x][y] + 1;
                q.push(make_pair(nx, ny));
            }
        }
    }
    return -1;
}

以上代码中,我们通过BFS算法,计算了从(sx, sy)到(ex, ey)的最短距离。需要注意的是,我们把起点标记为0,对于其他的单元格,一开始我们将它们的距离都标记为-1。同时,我们需要保证在遍历网格时,不遍历到障碍物(这里用0表示),否则会使距离增加。最后,如果找到了终点,则返回距离,否则返回-1表示到不了终点。

3. 示例

下面是一个简单的例子,来演示如何使用以上的代码计算最短路径:

#include <iostream>
using namespace std;

const int MAXN = 100;
int grid[MAXN][MAXN];

int main() {
    int n, m, sx, sy, ex, ey;
    cin >> n >> m >> sx >> sy >> ex >> ey;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    cout << shortestPath(sx, sy, ex, ey, n, m) << endl;
    return 0;
}

在上述程序中,我们先输入网格的大小以及起点和终点的坐标。接着,我们输入网格中每个单元格的状态(0表示通路,1表示障碍物)。最后,我们调用shortestPath函数来计算最短路径。

4. 性能分析

对于一个n*m的网格,上述算法的时间复杂度为O(nm),空间复杂度也是O(nm)。因为我们需要用一个n*m的数组来存储每个单元格的距离值,以及一个队列来进行BFS遍历。

5. 总结

本文介绍了如何使用C++来计算矩阵或网格中两个单元格之间的最短距离。具体来讲,我们使用了BFS算法,通过遍历网格中的单元格,计算每个单元格到起点的最短路径。而时间复杂度为O(nm),空间复杂度为O(nm)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例