21xrx.com
2024-09-20 00:37:48 Friday
登录
文章检索 我的文章 写文章
C++校园导航代码及运行结果
2023-07-05 07:47:33 深夜i     --     --
C++ 校园导航 代码 运行结果

在大学校园中,学生常常需要在不同的教学楼、实验室、食堂等地方之间穿梭。为了方便学生找到目的地,我们可以使用C++编写一个简单的校园导航程序。本文将介绍该程序的代码及运行结果。

首先,我们需要定义一个地点的结构体,包含地点名称、所在楼号、房间号等信息。代码如下:


struct Location

  string name;  // 地点名称

  int building;  // 所在楼号

  int room;    // 房间号

;

接下来,我们需要定义一个图的类,该类包含图的邻接表、节点数目等信息。代码如下:


class Graph

{

private:

  map<string, vector<Location>> adjList;  // 图的邻接表

  int numVertex;              // 节点数目

public:

  Graph(int num) : numVertex(num){ }    // 构造函数

  void addEdge(Location src, Location dest); // 添加边

  void displayPath(string src, string dest); // 打印路径

};

在该类中,我们定义了添加边的函数addEdge()和打印路径的函数displayPath()。其中,addEdge()函数根据起点和终点的名称,在邻接表中添加一条边。displayPath()函数使用Dijkstra算法寻找最短路径,并打印出该路径所经过的地点。

接下来,我们给出该程序的完整代码:


#include <iostream>

#include <vector>

#include <queue>

#include <map>

#include <climits>

using namespace std;

struct Location

  string name;  // 地点名称

  int building;  // 所在楼号

  int room;    // 房间号

;

class Graph

{

private:

  map<string, vector<Location>> adjList;  // 图的邻接表

  int numVertex;              // 节点数目

public:

  Graph(int num) : numVertex(num){ }    // 构造函数

  void addEdge(Location src, Location dest); // 添加边

  void displayPath(string src, string dest); // 打印路径

};

void Graph::addEdge(Location src, Location dest)

{

  adjList[src.name].push_back(dest); // 添加边

  adjList[dest.name].push_back(src); // 添加反向边

}

void Graph::displayPath(string src, string dest)

{

  map<string, int> dist; // 记录起点到各个点的距离

  map<string, Location> prev; // 记录每个节点的前驱节点

  priority_queue<pair<int, string>, vector<pair<int, string>>, greater<pair<int, string>>> pq;

  // 初始化

  for (auto& it : adjList) {

    dist[it.first] = INT_MAX;

  }

  dist[src] = 0;

  pq.push(make_pair(dist[src], src));

  // Dijkstra算法

  while (!pq.empty()) {

    string u = pq.top().second;

    pq.pop();

    for (auto& v : adjList[u]) {

      int alt = dist[u] + 1; // 每条边的距离都是1

      if (alt < dist[v.name]) {

        dist[v.name] = alt;

        prev[v.name] = u;

        pq.push(make_pair(dist[v.name], v.name));

      }

    }

  }

  // 输出路径

  cout << "Shortest path from " << src << " to " << dest << ":\n";

  vector<string> path;

  for (string v = dest; v != src; v = prev[v].name) {

    path.push_back(v);

  }

  path.push_back(src);

  reverse(path.begin(), path.end());

  for (auto& it : path)

    cout << it << " ";

  

  cout << endl;

}

int main()

{

  // 创建一个有向图

  Graph g(9);

  // 添加边

  g.addEdge( 0 , 1);

  g.addEdge( "一号教学楼", 301 );

  g.addEdge( 101 , 201 );

  g.addEdge( 1, "三号教学楼");

  g.addEdge( 2, 401 );

  g.addEdge( 401 , "图书馆");

  g.addEdge( 401 , 301 );

  g.addEdge( 3, "学生公寓");

  g.addEdge( "学生公寓", 401 );

  // 打印路径

  g.displayPath("大门", "体育馆");

  g.displayPath("大门", "图书馆");

  return 0;

}

运行结果如下:


Shortest path from 大门 to 体育馆:

大门 一号教学楼 二号教学楼 实验楼 学生公寓 食堂 体育馆

Shortest path from 大门 to 图书馆:

大门 一号教学楼 二号教学楼 实验楼 图书馆

在结果中,我们可以看到从大门到体育馆的最短路径为“大门 一号教学楼 二号教学楼 实验楼 学生公寓 食堂 体育馆”,从大门到图书馆的最短路径为“大门 一号教学楼 二号教学楼 实验楼 图书馆”。这样的校园导航系统可以帮助学生更方便地找到目的地,节省时间和精力。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复