创建一个至少有15个点的有向网表示的某个旅游景点的导游图。顶点代表景点,类型为字符串(例如,泰山导游图:“天地广场门”,“十八盘”,“冯玉祥墓”,“桃花峪门”,“中天门”,“南天门”,“玉皇顶”等),弧表示两个景点之间可以直达,弧上的权值表示两个景点之间的路程(公里数),弧上还有到达方法的信息(有步行和索道两种)。建立一个游客咨询系统。
(1)创建图的存储结构。
(2)输入两个景点名,就可以得到从一个景点到达另一个景点的所有简单路径、相应路径的路程公里数、行走的方法(每一段是步行,还是坐索道);
(3)输入两个景点名,就可以得到其最短路径,即:路程最短的行进方法;如果两者无路径可通,就得出“两景点不可达的信息”。
重点:
(1)通过实验掌握图状结构数据的存储与表式;
(2)通过实验掌握对图的存储、遍历、运算等各种操作;
(3)深入理解图的特征及应用;
难点:
(1)任意两个景点所有路径的计算;
(2)最短路径的计算与算法设计。
#include
#include
#include
#include
#define N 15
#define MAX 999
int min_len[N];
int route[N][N];
int visited[N];
int flag[N];
int stack[N];
int path[N][N];
int temp[N][N];
int start=99,end=99;
int v,w,m=1;
int static n=0;
typedef struct
{
char name[N][20];
int length[N][N];
char way[N][N];
}Point;
void init_path()
{
int i,k;
for(i=0;iname[i]);
fclose(fp1);
for(i=0;ilength[i][j]);
temp[i][j]=info->length[i][j];
}
}
fclose(fp2);
for(i=0;iway[i][j]);
}
fclose(fp3);
}
void output_view(Point *info)
{
int i,j;
printf("一共有%d个景点,关系如下:
",N);
for(i=0;iname[i]);
printf("
");
for(i=0;iname[i]);
if(j!=N)printf("%4d(%c)",info->length[i][j],info->way[i][j]);
else printf("
");
}
}
void Dijkstra(Point *info)
{
int i=1,j,min;
for(v=0;vlength[start][v];
for(w=0;wlength[v][w]length[v][w];
route[w][w]=1;
}
}
}
}
void DFS(Point *info,int p)
{
int i,j,len;
visited[p]=1;
for(i=0;ilength[p][i]!=MAX)
{
if(i==end)
{
n++;printf("第%d条: ",n);
for(j=0;j",stack[j]+1,info->name[stack[j]],info->way[stack[j]][stack[j+1]]);
printf("(%s)---%c--->",info->name[stack[j]],info->way[stack[j]][stack[j+1]]);
}
//printf("%d(%s)
",end+1,info->name[end]);
printf("(%s)
",info->name[end]);
}
else if(!visited[i])
{
info->length[p][i]=MAX;
visited[i]=1;
stack[m]=i;
m++;
DFS(info,i);
info->length[p][i]=temp[p][i];
visited[i]=0;
m--;
}
}
}
}
void receive(Point *info)
{
int i;
char a[20],b[20];
printf("
输入起点和终点标号,按# #退出:");scanf("%s%s",a,b);
printf("得出所有简单路径和最短路径
");
if(strcmp(a,"#")==0&&strcmp(b,"#")==0)return;
for(i=0;iname[i])==0)start=i;
if(strcmp(b,info->name[i])==0)end=i;
}
init_path();
//for(i=0;iname[start],info->name[end],min_len[end]);
for(i=0;iname[start],info->name[end],min_len[end]);
printf("最短路径为: ");
for(i=0;i",path[end][i]+1,info->name[path[end][i]],info->way[path[end][i]][path[end][i+1]]);
printf("(%s)---%c--->",info->name[path[end][i]],info->way[path[end][i]][path[end][i+1]]);
}
//printf("%d(%s)
",path[end][i]+1,info->name[path[end][i]]);
printf("(%s)
",info->name[path[end][i]]);
}
else {printf("
非常抱歉!!!景点%s无法到达%s",info->name[start],info->name[end]);}
printf("
");
}
start=end=99;n=0;
}
int main()
{
int i,j=0;
char x;
Point *view_info=NULL;
view_info=(Point *)malloc(sizeof(Point));
read_file(view_info);
msgbox(view_info);
printf("输入操作:");
while(scanf("%c",&x)!=EOF)
{
switch(x)
{
case 'S':msgbox(view_info);receive(view_info);printf("输入操作:");break;
case 'E':exit(0);
default :cur_sys();msgbox(view_info);printf("输入操作:");continue;
}
}
printf("谢谢使用!!!");
}
写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!
页面更新:2024-03-20
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号