校园导航——数据结构作业(一)

本文探讨了如何运用Dijkstra最短路径算法和深度优先搜索(DFS)解决校园导航的问题,通过数据结构邻接矩阵进行路径规划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🔗 拼多多内推~ 需要的小伙伴欢迎来看看!


算法:Dijkstra最短路,DFS
数据结构:邻接矩阵

// xydy.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include "iostream"
#include "cstdio"
#include "string"
#include "cstring"
#include "stack"
#define N 100
#define INF 200
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b
using namespace std;

struct Node
{
	int num;	//景点代码
	string name;//景点名称
	string pro;	//简介
};
Node school[N]= 
{ 
	{ 1,"行政楼","" },{ 2,"食堂","" },
	{ 3,"赛博楼","信息分院办公室所在地"},{ 4,"求是楼","实验楼计算机中心"},
	{ 5,"格致楼","法学管理学院" },{ 6,"工程实习中心","金工实习" },
	{ 7,"仰仪楼","机电计测分院" },{ 8,"体育馆","旁边有篮球场`足球场`还有网球场" },
	{ 9,"一号教学楼","主要以阶梯教室为主"},{ 10,"二号教学楼","小教室为多" } 
};

long long Edge[N][N];  //邻接矩阵存路径

int nodenum;   //节点总数

void Initial()
{
	nodenum = 10;
	memset(Edge, -1, sizeof(Edge));
}

void Insert_node()
{
	cout << "请输入:编号(0结束添加)  景点名  简介" << endl;
	int n;
	while (cin >> n&&n)
	{
		bool flag = 0;
		string name, pro;
		cin >> name >> pro;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == n)
			{

				cout << "编号重复,请重新输入编号" << endl;
				flag = 1;
				break;
			}
		}
		if (flag == 1)
			continue;
		nodenum++;
		school[nodenum - 1].num = n;
		school[nodenum - 1].name = name;
		school[nodenum - 1].pro = pro;
	}
}

void Insert_edge()
{
	cout << "请输入:起始景点编号   终止景点编号  路径长度(0 0 -1结束)" << endl;
	int from, to;
	long long value;
	while (cin >> from >> to >> value && from && to && (value!=-1))
	{
		bool flag1 = 0, flag2 = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == from)
				flag1 = 1;
			if (school[i].num == to)
				flag2 = 1;
		}
		if (flag1 == 1 && flag2 == 1)
		{
			Edge[from][to] = value;
			Edge[to][from] = value;
		}
		else
			cout << "编号错误,重新输入" << endl;
	}
}

void Insert()
{
	cout << "添加:1.添加景点  2.添加道路"<<endl;
	int n;
	cin >> n;
	switch (n)
 	{
	case 1:Insert_node(); break;
	case 2:Insert_edge(); break;
	default:cout << "输入错误"; break;
	}
}

void Modify()
{
	cout << "修改:修改景点的编号(0结束)   景点修改   简介修改"<<endl;
	int n;
	while (cin >> n&&n)
	{
		bool flag = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == n)
			{
				cin >> school[i].name >> school[i].pro;
				flag = 1;
			}
		}
		if (flag == 0)
			cout << "无此编号,重新输入" << endl;
	}
}

void Delete_node()
{
	cout << "请输入:景点编号(0结束)" << endl;
	int n;
	while (cin >> n&&n)
	{
		bool flag = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == n)
			{
				for (int k = 0; k < nodenum; k++)   //删路径
				{
					Edge[n][k] = -1;
					Edge[k][n] = -1;
				}
				for (int j = i; j < nodenum-1; j++)
				{
					school[j].num = school[j + 1].num;
					school[j].name = school[j + 1].name;
					school[j].pro = school[j + 1].pro;
				}
				nodenum--;
				flag = 1;
			}
		}
		if (flag == 0)
			cout << "无此编号,重新输入" << endl;
	}
}

void Delete_edge()
{
	cout << "请输入:起始景点编号   终止景点编号(0 0结束)" << endl;
	int from, to;
	while (cin >> from >> to&&from&&to)
	{
		bool flag1 = 0, flag2 = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == from)
				flag1 = 1;
			if (school[i].num == to)
				flag2 = 1;
		}
		if (flag1 == 1 && flag2 == 1)
		{
			Edge[from][to] = -1;
			Edge[to][from] = -1;
		}
		else
			cout << "编号错误,重新输入" << endl;
	}
}

void Delete()
{
	cout << "删除:1.删除景点   2.删除道路" << endl;
	int n;
	cin >> n;
	switch (n)
	{
	case 1:Delete_node(); break;
	case 2:Delete_edge(); break;
	default:cout << "输入错误"; break;
	}
}

void Display()
{
	for (int i = 0; i < nodenum; i++)
	{
		cout << school[i].num <<"\t"<< school[i].name<<"\t" << school[i].pro<<"\n";
	}
}

int maxnum()    //最大编号
{
	int max_num = -INF;
	for (int i = 0; i < nodenum; i++)
		max_num = max(max_num, school[i].num);
	return max_num;
}

void Showallway()
{
	int max_num = maxnum();
	cout << "所有相邻点连通的道路\t长度" << endl;
	for (int i = 1; i <= max_num; i++)
	{
		for (int j = i; j <= max_num; j++)
		{
			if (Edge[i][j]>=0)
				cout << i << "<——>" << j<<"\t\t"<< Edge[i][j] << endl;
		}
	}
}

void Shortway()
{
	cout << "请输入:出发景点编号   终点景点编号(0 0结束)" << endl;
	int from, to;
	while (cin >> from >> to && from && to)
	{
		long long tempEdge[N];
		memset(tempEdge, 0, sizeof(tempEdge));
		int flag1 = 0,flag2 = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == from)
				flag1 = 1;
			if (school[i].num == to)
				flag2 = 1;
		}
		/////////////////////////////////////////////////////////
		if (flag1 == 1 && flag2 == 1) 
		{
			bool visit[N];
			memset(visit, 0, sizeof(visit));
			long long path_next[N];          //记录路径,当前结点的后继节点
			long long max_num = -INF;     //最大编号
			max_num = maxnum();
			visit[from] = 1;
			while (true)						//最短路Dijstra
			{
				if (visit[to])
					break;
				long long min_edge = INF, min_nodej = INF, min_nodei;
				for (int i = 1; i <= max_num; i++)
				{
					if (visit[i] == 1)
					{
						for (int j = 1; j <= max_num; j++)
						{
							if (Edge[i][j] < min_edge && !visit[j] && Edge[i][j] != -1)
							{
								min_edge = Edge[i][j];
								min_nodej = j;
								min_nodei = i;
							}
						}
					}
				}
				visit[min_nodej] = 1;
				tempEdge[min_nodej] = Edge[min_nodei][min_nodej] + tempEdge[min_nodei];
				path_next[min_nodei] = min_nodej;
			}
			long long cur = from;
			cout << "最短路长度:" << tempEdge[to] << endl
				 <<"路径:";
			while (true)
			{
				if (cur == to)
				{
					cout << cur << endl;
					break;
				}
				cout << cur << "——>";
				cur = path_next[cur];
				
			}
			
		}
		else
			cout << "编号错误,重新输入" << endl;
	}
	/*
	1 2 3
	1 4 2
	2 4 0
	2 3 2
	3 4 4
	0 0 0
	*/
}

void Allway()
{
	cout << "请输入:出发景点编号   终点景点编号" << endl;
	int from, to;
	while (cin >> from >> to && from && to)
	{
		int flag1 = 0, flag2 = 0;
		for (int i = 0; i < nodenum; i++)
		{
			if (school[i].num == from)
				flag1 = 1;
			if (school[i].num == to)
				flag2 = 1;
		}
		////////////////////////////////////////////////////
		if (flag1 == 1 && flag2 == 1)
		{
			int visit[N][N],vis[N];   //边,点 访问
			memset(visit, 0, sizeof(visit));
			memset(vis, 0, sizeof(vis));
			int path_len;
			int path_next[N];     //记录路径
			//memset(path_next, 0, sizeof(path_next));
			stack<int>Stack;
			Stack.push(from);
			vis[from]++;
			while (!Stack.empty())
			{
				int cur = Stack.top();
				bool flag = 0;
				for (int i = 1; i <= maxnum(); i++)
				{
				p1:;
					path_len = 0;   //路径长度
					if (Edge[cur][i] >= 0 && !visit[cur][i]&& !vis[i])
					{
						if (i == to)
						{
							path_next[cur] = i;
							int cur1 = from;
							while (cur1 != to)
							{
								path_len += Edge[cur1][path_next[cur1]];
								cout << cur1<<"——>";
								cur1 = path_next[cur1];
							}
							cout << to << "\t\t道路长为:" << path_len <<endl;
							//visit[cur][i]++;
							i++;
							goto p1;
						}
						visit[cur][i]++;
						vis[i]++;
						Stack.push(i);
						path_next[cur] = i;
						flag = 1;
						break;
					}
				}
				if (flag == 0)
				{
					Stack.pop();
					vis[cur] = 0;   ////

				}
			}
		}
		else
			cout << "编号错误,重新输入" << endl;
	}
	/*
	1 2 3
	1 5 2
	2 5 1
	2 3 4
	3 5 3
	3 4 1
	4 5 2
	0 0 0
	*/
}

void Query()
{
	cout << "查询:1.显示所有景点信息    2.显示所有路径信息    3.A-B最短路    4.A-B所有路径"<<endl;
	int n;
	cin >> n;
	switch (n)
	{
	case 1:Display(); break;
	case 2:Showallway(); break;
	case 3:Shortway(); break;
	case 4:Allway(); break;
	default:cout << "输入错误"; break;
	}
}

int main()
{
	cout << "操作菜单:1.添加  2.修改  3.删除  4.查询  0.结束" << endl;
	int n;
	Initial();
	while (cin>>n&&n)
	{
		switch (n)
		{
		case 1:Insert(); break;
		case 2:Modify(); break;
		case 3:Delete(); break;
		case 4:Query(); break;
		default:
			break;
		}
		cout << "操作菜单:1.添加  2.修改  3.删除  4.查询  0.结束" << endl;
	}
    return 0;
}


设计你的学校的平面图,至少包括10个以上的景点(场所),每两个景点间可以有不同的路,且路长也可能不同,找出从任意景点到达另景点的最佳路径(最短路径)。 要求: (1)以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。 (2)为来访客人提供图中任意景点相关信息的查询。 (3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的条最短路径。 (4)提供图的编辑功能:增加、修改、删除景点;增加、修改、删除道路等。 (5)校园导游图的仿真界面。 8.学生成绩管理系统 学生成绩管理是高等学校教务管理的重要组成部分,主要包括学生注册、考试成绩的录入及修改、成绩的统计分析等等。设计个系统实现对学生成绩的管理。 要求系统应具有以下基本功能: (1)学生注册登记; (2)增加、删除某班级的学生; (3)成绩录入:输入学生的考试成绩; 要求采用二叉排序树存放学生成绩,门课程对应棵二叉排序树; (4)成绩修改:若输入错误可进行修改; (5)统计分析:对某个班级学生的单科成绩进行统计,求出平均成绩;求出成绩处于指定分数段内的学生人数;求出每个学生学期各科的平均成绩等; (6)查找:查找某个学生的某门课程成绩,查找某门课程成绩处于指定分数段内的学生名单等等。 (7)打印:打印个班级学生的单科成绩;打印某课程成绩处于指定分数段内的学生名单;打印学生在某学期的成绩报告单。
【摘要】西南科技大学抓住西部大开发和绵阳科技城建设的历史机遇,践行“厚德、博学、笃行、创新”校训,建设出座美丽的校园。为此通过对《数据结构》这课程的应用,用图的模型对学校景点抽象。用邻接矩阵存储方法和狄克斯特拉算法及图的遍历实现对校园导游系统的模拟。此系统七个功能:浏览学校景点、查看单个景点信息、查看校园地图、导游推荐、查两景点最短路线、查两景点所有景点、退出系统。 目 录 、问题描述及设计思路..............................................3 二、详细设计过程....................................................3 2.1设计校园平面图...............................................3 2.1.1景点分析.......................................................4 2.1.2平面图.........................................................4 2.2实现景点信息查询.............................................4 2.2.1景点存储.......................................................5 2.2.2景点信息查询功能实现...........................................5 2.3图实现路径查询...............................................5 2.3.1图的建立.......................................................5 2.3.2最短路径实现...................................................6 2.3.3两点间所有路径.................................................8 2.3.4路径查找设计结果...............................................8 三、结论体会.......................................................11 四、附录...........................................................12 4.1.1Mai.cpp.......................................................124.1.3Sight.h.......................................................13 4.1.2G.h...........................................................15 五、参考文献.......................................................20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值