zoukankan      html  css  js  c++  java
  • 数据结构课程设计 : 博物馆导航系统

    好久之前写的一个东西了,

    运行截图:

    对于所有的地点实现已经编号,便于后面算法的实现.

    各个功能介绍:

    1. 查看地图

    地图是自己用记事本写的, 输出的时候直接把记事本中的内容读取输出即可.

    另外用一个mapchart存储二维矩阵, 代表所有地点之间的距离

    2. 查看两点之间的最短距离, 这个我是用Dijkstra写的,其中加入了输出路径

    代码如下:

    void Dijkstra()
    {
    	int i,j,u,count,sum,s,v,t,min,dis[MaxSize],book[MaxSize],P[MaxSize][MaxSize];
    	char ch;
    	for(i=1; i<=Matrix.vexnum; i++)
    	{
    		printf("%d.", i);
    		name(i);
    		puts(" ");
    	}
    	printf("请输入起点:");
    	scanf("%d",&s);
    	getchar();
    	printf("
    ");
    	printf("请输入终点:");
    	scanf("%d",&t); 
    	getchar();
    	memset(book,0,sizeof(book));
    	book[s]=1;
    	for(v=1;v<=Matrix.vexnum;v++)
    	{
    		dis[v]=Matrix.map[s][v];
    		for(i=0;i<=Matrix.vexnum;i++) 
    			P[v][i]=0;
    	}
    		
    	for(i=1;i<Matrix.vexnum;i++)
    	{
    		min=inf;
    		for(j=1;j<=Matrix.vexnum;j++)
    			if(book[j]==0&&dis[j]<min)
    			{
    				min=dis[j];
    				u=j;
    			}
    		book[u]=1;
    		for(j=0;P[u][j]!=0;j++) ;
        		P[u][j]=u; 
    		for(v=1;v<=Matrix.vexnum;v++)
    		{
    			if(dis[v]>dis[u]+Matrix.map[u][v])
    			{
    				dis[v]=dis[u]+Matrix.map[u][v];
    				for(j=0;P[u][j]!=0;j++) 
    	  				P[v][j]=P[u][j];
    			}
    		}
    	}
        name(s); 
        for(j=0;P[t][j]!=0;j++)     //输出路径 
        {	
        	printf("->");
        	name(P[t][j]);
        }
     	printf("
    最短距离为 %d",dis[j]);	
     	printf("
    ");
    	puts(" ");
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");
    } 

    3. 以当前位置生成最小生成树,  prim生成最小生成树后输出长度就行了

    void prim()                    //prim算法求最小生成树 
    {
    	int i,j,u,count,sum,s,min,dis[MaxSize],book[MaxSize];
    	char ch; 
    	for(i=1; i<=Matrix.vexnum; i++)       //输出地名和编号 
    	{
    		printf("%d.", i);
    		name(i);
    		puts(" ");
    	}
    		
    	printf("请输入所在位置: ");
    	scanf("%d",&s);
    	getchar();
    	memset(book, 0, sizeof(book));
    	book[s]=1;
    	count=1;
    	sum=0;
    	for(i=1;i<=Matrix.vexnum;i++)
    		dis[i]=Matrix.map[s][i];
    	while(count<Matrix.vexnum)             //prim算法 
    	{
    		min=inf;
    		for(i=1;i<=Matrix.vexnum;i++)
    			if(book[i]==0&&min>dis[i])
    				{
    					min=dis[i];
    					u=i;
    				}
    		book[u]=1;
    		sum+=dis[u];
    		count++;
    		for(j=1;j<=Matrix.vexnum;j++)
    			if(book[j]==0&&dis[j]>Matrix.map[u][j])
    				dis[j]=Matrix.map[u][j];	
    	}
    	printf("以");
    	name(s);
    	printf("生成的最小生成树的长度为:%d
    ",sum);
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");  
    } 

     4.所有点之间的最短距离,这里我用的弗洛伊德算法, 也是比较基础的一个算法, 之后两两之间输出地名和距离.

    void Floyd()
    {
    	int k,i,j;
    	char ch; 
    	for(k=1;k<=Matrix.vexnum;k++)                //弗洛伊德算法 
    		for(i=1;i<=Matrix.vexnum;i++)
    			for(j=1;j<=Matrix.vexnum;j++)
    				if(Matrix.map[i][j]>Matrix.map[i][k]+Matrix.map[k][j])
    					Matrix.map[i][j]=Matrix.map[i][k]+Matrix.map[k][j]; 
    	for(i=1;i<=Matrix.vexnum;i++)
    			for(j=1;j<=Matrix.vexnum;j++)
    				if(i!=j)
    				{
    					printf("%d.",i);            //输出i对应的地名 
    					name(i);
    					printf("到 "); 
    					printf("%d.",j);           //输出j对应的地名
    					name(j);
    					printf("的最短距离为 %d
    ",Matrix.map[i][j]);      //输出最短距离 
    				}
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");                          //清屏 
    } 

    所有代码:

    #include<stdio.h>
    #include<windows.h>
    #include<string.h>
    #define MaxSize 20
    const int inf=99999999;             // 定义一个很大的数字认为是无限大 
    typedef struct chart
    {
    	int vexs[MaxSize];        		/*顶点数组*/
    	int map[MaxSize][MaxSize];		/*邻接矩阵*/
    	int vexnum;                     //顶点数 
    	int arcnum;                     //边数 
    }chart;
    chart Matrix;
    void SeeMaps();   					//查看地图函数 
    void Interface();                   //主页面
    void Getmapchart();                  //读取矩阵 
    void Name(int a);                        // 不同的数字代表不同的地点 
    void Floyd();                         //弗洛伊德算法求所有点之间的最短路径 
    void Explain();                     //程序说明 
    void prim();         				//prim算法求最小生成树 
    void Dijkstra();               		//dijkstra算法求两点之间的最短路 
    int main()                          //主函数 
    {
    	Interface();
    	int step;                       //操作选项 
    	while(1)
    	{
    		Getmapchart();              //获取邻接矩阵 
    		scanf("%d", &step);
    		getchar();
    		system("CLS"); 				//清屏
    		if(step==1)
    		{
    			SeeMaps();                //输出地图 
    			Interface();             //返回主页面 
    		}		 
    		else if(step==2)
    		{
    			Dijkstra();               //dijkstra算法求两点之间的最短路 
    			Interface();             //返回主页面
    		}
    		else if(step==3)
    		{
    			prim();                     //求最小生成树 
    			Interface();                //返回主页面
    		}
    		else if(step==4)
    		{
    			Floyd();                     //弗洛伊德算法 
    			Interface();                //返回主页面 
    		}
    		else if(step==5)
    		{
    			Explain();                 //调用程序说明的函数 
    			Interface();               //返回主页面 
    		}
    		else if(step==6)              //程序结束 
    			break;
    		else
    		{
    			printf("输入错误!");
    			char ch; 
    			while(scanf("%c",&ch),ch!='
    ');
    				system("CLS");                //清屏 
    			Interface(); 
    		}
    	}
    	return 0;
    } 
    void Getmapchart()                     //读取矩阵 
    {
    	FILE *fp;
    	int i,j;
    	fp=fopen("mapchart.txt","r");      //打开矩阵的文件 
    	Matrix.vexnum=15;                  //顶点数为15 
    	Matrix.arcnum=24;                   //边的数目为24 
    	for(i=1;i<=Matrix.vexnum;i++)        //循环读取 
    		for(j=1;j<=Matrix.vexnum;j++)
    		{
    			fscanf(fp,"%d",&Matrix.map[i][j]);  //将在文件中获取到的数字赋给矩阵 
    			if(i!=j&&Matrix.map[i][j]==0)		//如果两个地点之间没有路可以到达,
    				Matrix.map[i][j]=inf;            //认为它们之间的距离为无限大 
    		}
    	fclose(fp);      		 //关闭文件 		
    }
    void Interface()                   //主页面 
    {
    	printf("1.查看地图
    ");
    	printf("2.当前位置到指定位置的最短路径
    ");
    	printf("3.以当前位置生成最小生成树
    ");
    	printf("4.所有点之间的最短距离
    ");
    	printf("5.说明
    ");
    	printf("6.退出
    ");
    	return ;
    }
    void SeeMaps()   					//查看地图 
    {
    	FILE *fp;
    	char ch;
    	fp=fopen("map.txt","r");      //打开保存地图的文件 
    	for(;(ch=fgetc(fp))!=EOF; )  //输出保存在文件中地图
    		putchar(ch);
    	puts(" ");		
    	
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    			system("CLS");                //清屏 
    	fclose(fp);      		 //关闭文件 
    	return ;
    }
    void name(int a)              //调用函数可以输出相应的数字所对应的地名 
    {
    	switch(a)
    	{
    		case 1:printf("北门");break;
    		case 2:printf("西门");break;
    		case 3:printf("南门");break;
    		case 4:printf("东门");break;
    		case 5:printf("陶瓷馆");break;
    		case 6:printf("近代历史馆");break;
    		case 7:printf("玉器馆");break;
    		case 8:printf("猿人馆");break;
    		case 9:printf("厕所");break;
    		case 10:printf("玺印馆");break;
    		case 11:printf("雕塑馆");break;
    		case 12:printf("绘画馆");break;
    		case 13:printf("传统家具馆");break;
    		case 14:printf("休息区");break;
    		case 15:printf("中央喷水池");break;
    	}	 
    }
    void Floyd()
    {
    	int k,i,j;
    	char ch; 
    	for(k=1;k<=Matrix.vexnum;k++)                //弗洛伊德算法 
    		for(i=1;i<=Matrix.vexnum;i++)
    			for(j=1;j<=Matrix.vexnum;j++)
    				if(Matrix.map[i][j]>Matrix.map[i][k]+Matrix.map[k][j])
    					Matrix.map[i][j]=Matrix.map[i][k]+Matrix.map[k][j]; 
    	for(i=1;i<=Matrix.vexnum;i++)
    			for(j=1;j<=Matrix.vexnum;j++)
    				if(i!=j)
    				{
    					printf("%d.",i);            //输出i对应的地名 
    					name(i);
    					printf("到 "); 
    					printf("%d.",j);           //输出j对应的地名
    					name(j);
    					printf("的最短距离为 %d
    ",Matrix.map[i][j]);      //输出最短距离 
    				}
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");                          //清屏 
    } 
    void Explain()            //程序说明 
    {	 
    	char ch;
    	printf("本程序用于实现博物馆导游系统,
    "); 
    	printf("操作1可以查看地图
    "); 
    	printf("操作2可以查看两个点之间的最短距离及路径
    ");
    	printf("操作3可以查看以当前位置生成最小生成树的长度
    ");
    	printf("操作4可以任意两个点之间的最短距离
    ");
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    	while(scanf("%c",&ch),ch!='
    ');
    		system("CLS");                          //清屏 
    }
    void prim()                    //prim算法求最小生成树 
    {
    	int i,j,u,count,sum,s,min,dis[MaxSize],book[MaxSize];
    	char ch; 
    	for(i=1; i<=Matrix.vexnum; i++)       //输出地名和编号 
    	{
    		printf("%d.", i);
    		name(i);
    		puts(" ");
    	}
    		
    	printf("请输入所在位置: ");
    	scanf("%d",&s);
    	getchar();
    	memset(book, 0, sizeof(book));
    	book[s]=1;
    	count=1;
    	sum=0;
    	for(i=1;i<=Matrix.vexnum;i++)
    		dis[i]=Matrix.map[s][i];
    	while(count<Matrix.vexnum)             //prim算法 
    	{
    		min=inf;
    		for(i=1;i<=Matrix.vexnum;i++)
    			if(book[i]==0&&min>dis[i])
    				{
    					min=dis[i];
    					u=i;
    				}
    		book[u]=1;
    		sum+=dis[u];
    		count++;
    		for(j=1;j<=Matrix.vexnum;j++)
    			if(book[j]==0&&dis[j]>Matrix.map[u][j])
    				dis[j]=Matrix.map[u][j];	
    	}
    	printf("以");
    	name(s);
    	printf("生成的最小生成树的长度为:%d
    ",sum);
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");  
    } 
    void Dijkstra()
    {
    	int i,j,u,count,sum,s,v,t,min,dis[MaxSize],book[MaxSize],P[MaxSize][MaxSize];
    	char ch;
    	for(i=1; i<=Matrix.vexnum; i++)
    	{
    		printf("%d.", i);
    		name(i);
    		puts(" ");
    	}
    	printf("请输入起点:");
    	scanf("%d",&s);
    	getchar();
    	printf("
    ");
    	printf("请输入终点:");
    	scanf("%d",&t); 
    	getchar();
    	memset(book,0,sizeof(book));
    	book[s]=1;
    	for(v=1;v<=Matrix.vexnum;v++)
    	{
    		dis[v]=Matrix.map[s][v];
    		for(i=0;i<=Matrix.vexnum;i++) 
    			P[v][i]=0;
    	}
    		
    	for(i=1;i<Matrix.vexnum;i++)
    	{
    		min=inf;
    		for(j=1;j<=Matrix.vexnum;j++)
    			if(book[j]==0&&dis[j]<min)
    			{
    				min=dis[j];
    				u=j;
    			}
    		book[u]=1;
    		for(j=0;P[u][j]!=0;j++) ;
        		P[u][j]=u; 
    		for(v=1;v<=Matrix.vexnum;v++)
    		{
    			if(dis[v]>dis[u]+Matrix.map[u][v])
    			{
    				dis[v]=dis[u]+Matrix.map[u][v];
    				for(j=0;P[u][j]!=0;j++) 
    	  				P[v][j]=P[u][j];
    			}
    		}
    	}
        name(s); 
        for(j=0;P[t][j]!=0;j++)     //输出路径 
        {	
        	printf("->");
        	name(P[t][j]);
    	}
     	printf("
    最短距离为 %d",dis[j]);	
     	printf("
    ");
    	puts(" ");
    	printf("回车键返回...
    ");           //输入回车返回主页面 
    		while(scanf("%c",&ch),ch!='
    ');
    	system("CLS");
    } 
  • 相关阅读:
    .Net里的Attribute 学习
    浅谈并发与并行(一)
    Asp.net Mvc4默认权限详细(下)
    Enum是如何用的?
    指针与引用
    栈与队列
    mini2440裸机之I2C
    解决Delphi MDI 闪烁问题(使用WM_SETREDRAW锁屏后进行处理)
    DelphiXE 显示GIF动画
    参数传递方法(Delphi1.0与win16API使用pascal方法,即从左到右)
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852472.html
Copyright © 2011-2022 走看看