怎么用C++构建一个简单的校园导航系统
时间: 2024-01-25 17:04:06 浏览: 156
一个简单的校园导航系统可以通过以下步骤用C++来实现:
1. 定义节点和边的结构体
首先,我们需要定义一个节点的结构体,用于存储节点的信息,例如节点的名称、位置等。同时,我们还需要定义一个边的结构体,用于存储两个节点之间的距离或时间等信息。
```c++
struct Node {
string name; // 节点名称
int x; // 节点横坐标
int y; // 节点纵坐标
};
struct Edge {
int from; // 起点编号
int to; // 终点编号
int weight; // 边的权值
};
```
2. 构建图
接下来,我们可以将节点和边组合成一个图。我们可以使用邻接矩阵来存储图的信息,也可以使用邻接表来存储图的信息。这里我们使用邻接矩阵来存储图的信息。
```c++
const int MAX_NODE = 100; // 最大节点数
int g[MAX_NODE][MAX_NODE]; // 邻接矩阵
int n; // 节点数
int m; // 边数
```
3. 实现校园导航功能
校园导航系统的主要功能是查询两个节点之间的最短路径。我们可以使用Dijkstra算法来实现最短路径查询。
```c++
const int INF = 0x3f3f3f3f; // 无穷大
int dist[MAX_NODE]; // 起点到各个节点的最短距离
bool visited[MAX_NODE]; // 记录节点是否已经访问
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(visited, false, sizeof(visited));
dist[s] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = true;
for (int v = 0; v < n; v++) {
if (!visited[v] && g[u][v] != INF && dist[u] + g[u][v] < dist[v]) {
dist[v] = dist[u] + g[u][v];
}
}
}
}
```
4. 完整代码
```c++
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int MAX_NODE = 100; // 最大节点数
const int INF = 0x3f3f3f3f; // 无穷大
struct Node {
string name; // 节点名称
int x; // 节点横坐标
int y; // 节点纵坐标
};
struct Edge {
int from; // 起点编号
int to; // 终点编号
int weight; // 边的权值
};
int g[MAX_NODE][MAX_NODE]; // 邻接矩阵
int n; // 节点数
int m; // 边数
Node nodes[MAX_NODE]; // 存储节点的信息
bool visited[MAX_NODE]; // 记录节点是否已经访问
int dist[MAX_NODE]; // 起点到各个节点的最短距离
// Dijkstra算法求最短路径
void dijkstra(int s) {
memset(dist, INF, sizeof(dist));
memset(visited, false, sizeof(visited));
dist[s] = 0;
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = true;
for (int v = 0; v < n; v++) {
if (!visited[v] && g[u][v] != INF && dist[u] + g[u][v] < dist[v]) {
dist[v] = dist[u] + g[u][v];
}
}
}
}
int main() {
cout << "请输入节点数和边数:" << endl;
cin >> n >> m;
memset(g, INF, sizeof(g));
for (int i = 0; i < n; i++) {
cout << "请输入节点" << i << "的名称、横坐标和纵坐标:" << endl;
cin >> nodes[i].name >> nodes[i].x >> nodes[i].y;
}
for (int i = 0; i < m; i++) {
int u, v, w;
cout << "请输入边" << i << "的起点、终点和长度:" << endl;
cin >> u >> v >> w;
g[u][v] = g[v][u] = w;
}
cout << "请输入起点和终点的编号:" << endl;
int s, t;
cin >> s >> t;
dijkstra(s);
cout << "从" << nodes[s].name << "到" << nodes[t].name << "的最短路径长度为:" << dist[t] << endl;
return 0;
}
```
在上面的代码中,我们先输入节点数和边数,然后依次输入每个节点的名称、横坐标和纵坐标,以及每条边的起点、终点和长度。接着,输入起点和终点的编号,然后调用dijkstra函数求最短路径。最后输出从起点到终点的最短路径长度。
阅读全文