c语言实现简单的导航图

c语言实现最简单的导航图

西安邮电的一个非常简单的导航图,使用dev即可运行

#include <stdio.h>

#include <stdlib.h>

#include<string.h> 

#define M 5000              //假设两顶点之间没有路径,用5000来表示 

typedef struct vexsinfo     //存放顶点信息的结构体

{

    int park;               //访问的标志,park=0是未被访问过

    int num;                //景点的编号

    char name[32];          //景点的名称

    char introduction[256]; //景点的介绍

}vexsinfo;
 
typedef struct MGraph       

{

    int r;                  //记录最短路径访问过的景点数目

    int minrude;            //记录最短路径的长度

    int min[50];            //记录最短路径经过的顶点信息

    int a[50];              //记录路线的数组

    vexsinfo vexs[50];      //存放顶点编号的数组,用vexsinfo结构体的变量vexsinfo定义,可以用

                            //该数组存放顶点信息            

    int arc[50][50];        //存放两点之间权值的邻接矩阵

    int v,e;                //定点数和边数

} MGraph;

 

MGraph* CreateGraph()

{

    MGraph *G;

	int i,j,k;

	G=(MGraph*)malloc(sizeof(MGraph));    //初始化访问标志

	for(i=0;i<10;i++){

    G->vexs[i].park=0;

    }	//初始化顶点数目和路线数目

	G->v=10;

	G->e=13;	//给景点数组编号
	for(i=1;i<=G->v;i++)

		G->vexs[i].num=i;

	for(j=1;j<=10;j++)

		for(k=1;k<=10;k++)

		{

			G->arc[j][k]=M;

		}		//初始化矩阵,赋予每条边权值

			G->arc[1][2]=G->arc[2][1]=100;

			G->arc[1][3]=G->arc[3][1]=500;

			G->arc[1][10]=G->arc[10][1]=800;

			G->arc[2][6]=G->arc[6][2]=700;

			G->arc[4][3]=G->arc[3][4]=700;

			G->arc[4][5]=G->arc[5][4]=100;

			G->arc[10][4]=G->arc[4][10]=400;

			G->arc[6][7]=G->arc[7][6]=500;

			G->arc[7][8]=G->arc[8][7]=400;

			G->arc[10][7]=G->arc[7][10]=300;

			G->arc[8][4]=G->arc[4][8]=700;

			G->arc[8][10]=G->arc[10][8]=600;

			G->arc[6][10]=G->arc[10][6]=400;

			G->arc[9][6]=G->arc[6][9]=700;
			
			G->arc[9][7]=G->arc[7][9]=900;      //初始化顶点信息

        strcpy(G->vexs[1].name ,"校  门");

        strcpy(G->vexs[2].name ,"邮政所");

        strcpy(G->vexs[3].name ,"基础教学楼");

        strcpy(G->vexs[4].name ,"操场");

        strcpy(G->vexs[5].name ,"美食广场");

        strcpy(G->vexs[6].name ,"大学生活动中心");

        strcpy(G->vexs[7].name ,"体育馆");

        strcpy(G->vexs[8].name ,"旭日苑");

        strcpy(G->vexs[9].name ,"天桥");

        strcpy(G->vexs[10].name ,"图书馆");

        strcpy(G->vexs[1].introduction ,"西安邮电大学长安南校区正门");

        strcpy(G->vexs[2].introduction ,"邮政快递所");

        strcpy(G->vexs[3].introduction ,"基础教学楼a,b,课程学习的地方");

        strcpy(G->vexs[4].introduction ,"篮球场,排球场,乒乓球场,跑道");

        strcpy(G->vexs[5].introduction ,"西安邮电大学的餐厅");

        strcpy(G->vexs[6].introduction ,"举办各式特色活动");

        strcpy(G->vexs[7].introduction ,"篮球喜好者的狂热,会举办篮球比赛");

        strcpy(G->vexs[8].introduction ,"皇家旭日大酒店");

        strcpy(G->vexs[9].introduction ,"东区西区连接的桥梁");

        strcpy(G->vexs[10].introduction ,"学校图书馆,藏书颇多,学习圣地");

        return G;

}
//使用了邻接矩阵的思想,从邻接矩阵的第一行第一个点对后面点的不断递归查找,返回上一层时候对顶点信息初始化为递归前的状态
//直接选取暴力枚举的方法,把所有的路径都给枚举出来
void RudeGraph(MGraph *G,int b,int w,int k,int sum){

        int p,j,n;

             if(b==w) {     //如果找到终点则进行输出,否则继续查找 

                    for(p=0;p<k;p++){

                        printf("%d->",G->a[p]);

                    }

                    printf("%d  ",G->a[k]);

                    printf("路线总长:%dm\n",sum);

                    return ;

                }

        else{

        for(j=1;j<=10;j++){

           if(G->arc[b][j]<5000&&G->vexs[j].park==0){

                    k++;

                    G->a[k]=j;

                    sum+=G->arc[b][j];             

                    G->vexs[j].park=1;

                    RudeGraph(G,j,w,k,sum);    //通过递归对所有路径进行深度搜索

                    k--;                       //递归返回这一层后对顶点信息进行重新初始化

                    G->vexs[j].park=0; 

                    sum-=G->arc[b][j];

            } 

        }

   }

    return ;

}

int main(void)

{

    int c,i,p,k;

    MGraph *T;

    T=CreateGraph();

    while(1){

    printf("**********************************\n");

    printf("欢迎来到西安邮电大学景点信息服务系统\n");

    printf("1.景点信息查询\n");

    printf("2.路线查询服务\n");

    printf("3.退出\n");

    printf("**********************************\n");

    printf("请选择你要查询的功能:\n");

    scanf("%d",&c);

    if(c==1){

            printf("**********************************\n");

            printf("西安邮电大学共有如下十处景点:\n");

            for(i=1;i<=10;i++){

                printf("%d.",T->vexs[i].num);

                printf("%s:    ",T->vexs[i].name);

                printf("%s\n",T->vexs[i].introduction);

            }

    }

    else if(c==2){

            printf("**********************************\n");

            printf("请输入当前景点编号和你想要去的景点编号:\n");

            printf("(注:景点编号可在功能1内查询)\n");

            int b,w;            //初始化访问标志

                    for(i=0;i<10;i++){

                    T->vexs[i].park=0;

                    }

            scanf("%d %d",&b,&w);

            while(b<1||b>10||w<1||w>10){

                printf("输入错误,请重新输入:\n");

                scanf("%d %d",&b,&w);

            }

            if(b==w){

                printf("您已经在此景点,请重新输入:\n");

                scanf("%d %d",&b,&w);

            }

            else{

                T->a[0]=b;

                T->vexs[b].park=1;

                printf("从景点%d到景点%d共有如下路径:\n",b,w);

                RudeGraph(T,b,w,0,0);
            				
                printf("%d  ",T->min[T->r]);

                printf("路线总长:%dm\n",T->minrude);

                T->minrude=100;                        //重新初始化最短路径长度

                        }

           }
    else if(c==3) break;

    else printf("输入错误,请重新输入:\n");
  }

    return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值