数据结构作业--校园周游

本文为校园周游系统,我自己做了一个见到的校园布局图,可以直接使用,已通过验收。

题目:校园周游

背景:

目前杭州旅游业蒸蒸日上,越来越多的人来我们学校参观,因此本程序设计一个校园周游导航系统为参观者服务。

# include <stdio.h>
# include <conio.h>
# include <stdlib.h>

int map[20][20];        //存放各点间距离 
int pre[20][20];        //存放路径 

void list()										//主菜单
{
	system("cls");
	printf("\n");
	printf("\t\t          欢迎使用hdu导游系统       \n");
	printf("\t\t --------------------------------------------\n");
	printf("\t\t|                                            |\n");
	printf("\t\t|                                            |\n");
	printf("\t\t|                                            |\n");
	printf("\t\t|        1.显示校园平面图.                   |\n");
	printf("\t\t|        2.校门口到各个场所的最短路径.       |\n");
	printf("\t\t|        3.查询信息                          |\n");
	printf("\t\t|        4.退出                              |\n");
	printf("\t\t|                                            |\n");
	printf("\t\t|                                            |\n");
	printf("\t\t --------------------------------------------\n");
	printf("\n\t\t       请输入您要进行的操作的序号          \n");
	
	
	
}
void view(){
	system("cls");
	printf("\n");
    printf("     【学校地图】\n");
    printf("一横段代表10,竖和斜断代表50  \n");
	printf("2--------1                  \n");
    printf("|        |                  \n");
    printf("10-------3--------4          \n");
    printf("|        |       /         \n");
    printf("9-----8--5-6----7         \n");
    printf("按任意键返回主菜单.\n");
    getch();
    list();
}	

void cha(){
	
	int a;
	printf("请输入查询地点:");
	scanf("%d",&a);
	printf("%d号景点环境优美,历史悠久,具有60年的历史\n",a);
	printf("输入任意键返回\n");
	getch();
	list();
}
void floyd()								//弗洛伊德算法求最短路
{
    int i,j,k;
    for(k = 1;k <= 10;k ++)
    {
        for(i = 1;i <= 10;i ++)
        {
            if( i == k || map[i][k]==-1 ) continue;
            for(j = 1;j <= 10;j ++)
            {
                if( k == j || i == j || map[k][j] == -1 ) continue;
                int tmp = map[i][k] + map[k][j];
                if(map[i][j] == -1 || map[i][j] > tmp)
                {
                    map[i][j] = tmp;
                    pre[i][j] = pre[i][k];
                }
                else if(map[i][j] == tmp && pre[i][k] < pre[i][j])
                {
                    pre[i][j]=pre[i][k];
                }
            }
        }
    }
}
void Initiate( )								//初始化map[]和pre[],存放map[]的距离
{
	int i,j;
	for(i = 1;i <= 10;i ++)
	{
		for(j = 1;j <= 10;j ++)
		{
			pre[i][j] = j;
			if(i==j) map[i][j] = 0;
			else
				map[i][j] = -1;
		}
	}
	map[1][2] = map[2][1] = 80;
	map[1][3] = map[3][1] = 50;
	map[3][4] = map[4][3] = 80;
	map[3][5] = map[5][3] = 50;
	map[5][6] = map[6][5] = 10;
	map[6][7] = map[7][6] = 40;
	map[5][8] = map[8][5] = 20;
	map[4][7] = map[7][4] = 50;
	map[9][8] = map[8][9] = 50;
	map[10][9] = map[9][10] = 50;
	map[2][10] = map[10][2] = 50;
	map[3][10] = map[10][3] = 70;	
}
void lu(int x,int y)							//输出起点到终点的路径
{
 	 int tal,lu;
	 printf("路径: %d",x);
     lu=map[x][y];
	 while(pre[x][y] != y)
     {
		 printf("--> ");
         printf("%d",pre[x][y]);
         
		 x = pre[x][y];
         
     }
	 printf("--> ");
     printf("%d",y);
	 printf("\n路径长度为%d\n",lu);
	 
}
void zd(){

	system("cls");
	int strat,end;
	printf("2--------1                  \n");
    printf("|        |                  \n");
    printf("10-------3--------4          \n");
    printf("|        |       /         \n");
    printf("9-----8--5-6----7         \n");
    printf("请选择起点的景点(1-10): ");
	scanf("%d",&strat);
	printf("\n");
	printf("请选择终点的景点(1-10): ");
	scanf("%d",&end);
	printf("\n");
	if(strat != end)
    {	 
		 lu(strat,end);
 		 printf("\n");
	}
	else 	
	{
	 	printf("起点与终点相同.\n");
	}
	printf("按任意键返回.\n");
	getch();
}
int main( )
{
	int flag = 0;
	while( flag==0 )
	{
		list();
		int n;
		scanf("%d",&n);
		Initiate();
		floyd();
		switch(n)
		{
			case 1:  view();break;
			case 2:  zd();break;
			case 3:  cha();break;
			case 4:  flag = 1;break;
			default  :  list();break;
		}
	}
	return 0;

}

结果展示及分析

菜单展示

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微雨盈萍cbb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值