校园导游 c数据结构程序设计

rongfei3380 2010-01-07 03:02:49

void HaMiTonian(int m) //哈密尔顿图遍历
{
if(m>8) return;
L: NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[0][x[8]-1].adj!=20000)
display();
else
HaMiTonian(m+1);
goto L;
}


void NextValue(int k)
{
int j;
l:x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)
{
for(j=0;j<k;j++)
if(x[j]==x[k])
goto l;
return;
}
else
goto l;
}


void display()
{
int i=0;
printf("\n\n\t");
for(i=0;i<8;i++)
printf("%s->",G.vex[x[i]-1].sight);
printf("出口");
printf("\n");
}


我不明白 在 第一个 函数中 if(m==7&&G.arcs[0][x[8]-1].adj!=20000) 中的 7 为什么这样设定 ?
ps:这是校园导游中 求推荐游览路线的 一段 代码 有 八个景点 !
...全文
1557 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo364 2010-01-07
  • 打赏
  • 举报
回复
7个路径全部走过了,所以就去出口了,在之前打印所有的路径
rongfei3380 2010-01-07
  • 打赏
  • 举报
回复

#include "string.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define Max 20000//最大值为20000
#define NUM 10//顶点最大数为10


typedef struct ArcCell//弧信息
{
int adj; //权值,顶点距离
}ArcCell;

typedef struct VertexType//顶点类型
{
int number;
char *sight; //景点名称
char *description;//景点介绍
}VertexType;

typedef struct
{
VertexType vex[NUM];//顶点向量
ArcCell arcs[NUM][NUM];//数组表示,邻接矩阵
int vexnum,arcnum;//图的当前顶点数和弧数
}MGraph;

MGraph G;
int P[NUM][NUM]; //定义景点指针
long int D[NUM]; //最短距离
int x[10]={0};
void CreateUDN(int v,int a);
void narrate();
void ShortestPath(int num);
void output(int sight1,int sight2);
char Menu();
void search();
char SearchMenu();
void HaMiTonian(int);
void NextValue(int);
void display();


void main()
{

int v0,v1;
char ck;
CreateUDN(NUM,14);//构造图
do
{
ck=Menu();
switch(ck)
{
case '1':
system("cls");
narrate();
printf("\n\n\t\t\t请选择起点景点(0~9):");
scanf("%d",&v0);
printf("\t\t\t请选择终点景点(0~9):");
scanf("%d",&v1);
ShortestPath(v0);
output(v0,v1);
printf("\n\n\t\t\t\t请按ENTER继续...\n");
getchar();
getchar();
break;
case '2':search();
break;
case '3':
system("cls");
//narrate();
x[0]=1;
HaMiTonian(1);
printf("\n\n\t\t\t\t请按任意键继续...\n");
getchar();
getchar();
break;
};
}while(ck!='e');
}


char Menu()
{
char c;
int flag;
do
{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、查询景点路径 ┃\n");
printf("\t\t\t┃ 2、查询景点信息 ┃\n");
printf("\t\t\t┃ 3、推荐参观路线 ┃\n");
printf("\t\t\t┃ e、退出 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='3'||c=='e')
flag=0;
}while(flag);
return c;
}

char SearchMenu() //查询景点路径
{
char c;
int flag;
do
{
flag=1;
system("cls");
narrate();
printf("\n\t\t\t┏━━━━━━━━━━━━━━━┑\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┃ 1、按照景点编号查询 ┃\n");
printf("\t\t\t┃ 2、按照景点名称查询 ┃\n");
printf("\t\t\t┃ e、返回 ┃\n");
printf("\t\t\t┃ ┃\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━┛\n");
printf("\t\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
return c;
}


void search() //查询景点信息
{
int num;
int i;
char c;
char name[20];

do
{
system("cls");
c=SearchMenu();
switch (c)
{
case '1':
system("cls");
narrate();
printf("\n\n\t\t请输入您要查找的景点编号:");
scanf("%d",&num);
for(i=0;i<NUM;i++)
{
if(num==G.vex[i].number)
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按ENTER返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按ENTER返回...");
getchar();
getchar();
}
break;
case '2':
narrate();
system("cls");
printf("\n\n\t\t请输入您要查找的景点名称:");
scanf("%s",name);
for(i=0;i<NUM;i++)
{
if(!strcmp(name,G.vex[i].sight))//?
{
printf("\n\n\t\t\t您要查找景点信息如下:");
printf("\n\n\t\t\t%-25s\n\n",G.vex[i].description);
printf("\n\t\t\t按ENTER返回...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t没有找到!");
printf("\n\n\t\t\t按ENTER返回...");
getchar();
getchar();
}
break;
}
}while(c!='e');
}


void CreateUDN(int v,int a)//采用数组表示法,构造无向图G
{
int i,j;
G.vexnum=v; //初始化图的顶点数和边数
G.arcnum=a;
for(i=0;i<G.vexnum;++i) G.vex[i].number=i;//初始化每一个顶点的编号



G.vex[0].sight="大门";
G.vex[0].description="校园出入的正门。";
G.vex[1].sight="图书馆";
G.vex[1].description="阅览,借阅图书。";
G.vex[2].sight="行政楼";
G.vex[2].description="教师,校领导办公。";
G.vex[3].sight="一食堂";
G.vex[3].description="老校区餐饮";
G.vex[4].sight="小礼堂";
G.vex[4].description="日常庆典活动,社团演出";
G.vex[5].sight="小湖";
G.vex[5].description="休闲,放松心情";
G.vex[6].sight="下沉广场";
G.vex[6].description="网球、排球、篮球及校园舞会举办";
G.vex[7].sight="东南宿舍";
G.vex[7].description="学生日常生活起居地";
G.vex[8].sight="二食堂";
G.vex[8].description="东南校区餐饮";
G.vex[9].sight="东南操场";
G.vex[9].description="篮球、排球、足球场地";


for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)//初始化邻接矩阵
G.arcs[i][j].adj=Max;
G.arcs[0][1].adj=G.arcs[1][0].adj=15;
G.arcs[1][2].adj=G.arcs[2][1].adj=24;
G.arcs[1][3].adj=G.arcs[3][1].adj=22;
G.arcs[1][4].adj=G.arcs[4][1].adj=16;
G.arcs[1][5].adj=G.arcs[5][1].adj=50;
G.arcs[2][7].adj=G.arcs[7][2].adj=800;
G.arcs[3][4].adj=G.arcs[4][3].adj=15;
G.arcs[3][6].adj=G.arcs[6][3].adj=10;
G.arcs[4][6].adj=G.arcs[6][4].adj=10;
G.arcs[5][6].adj=G.arcs[6][5].adj=20;
G.arcs[5][7].adj=G.arcs[7][5].adj=500;
G.arcs[7][8].adj=G.arcs[8][7].adj=50;
G.arcs[7][9].adj=G.arcs[9][7].adj=200;
G.arcs[8][9].adj=G.arcs[9][8].adj=100;
}


void narrate()//界面美化
{
int i,k=0;
printf("\n\t\t*****************欢迎使用校园导游程序***************\n");
printf("\n\t\t********************南阳理工*******************\n");
printf("\n\t\t****************************************");
printf("\n\t\t\t\t景点名称\n");
printf("\t\t****************************************\n");
for(i=0;i<NUM;i++)
{
printf("\t\t\t\t\t(%2d)%-10s\t\t\t\n",i,G.vex[i].sight);
k=k+1;
}
printf("\t_________________________________________________________________\n");
}


void ShortestPath(int num)//最短路径
{
int v,w,i,t;
int final[NUM]; //辅助数组
int min;
for(v=0;v<NUM;v++)
{
final[v]=0;
D[v]=G.arcs[num][v].adj;
for(w=0;w<NUM;w++)
P[v][w]=0;
if(D[v]<20000)
{
P[v][num]=1;
P[v][v]=1;
}
}

D[num]=0;
final[num]=1;

for(i=0;i<NUM;++i)
{
min=Max;
for(w=0;w<NUM;++w)
if(!final[w])
if(D[w]<min)
{
v=w;
min=D[w];
}
final[v]=1;
for(w=0;w<NUM;++w)
if(!final[w]&&((min+G.arcs[v][w].adj)<D[w]))
{
D[w]=min+G.arcs[v][w].adj;
for(t=0;t<NUM;t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
}


void output(int sight1,int sight2) //输出界面
{
int a,b,c,d,q=0;
a=sight2;
if(a!=sight1)
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
printf("\t(最短距离为 %dm.)\n\n\t",D[a]);
printf("\t%s",G.vex[sight1].sight);
d=sight1;
for(c=0;c<NUM;++c)
{
gate:; //?
P[a][sight1]=0;
for(b=0;b<NUM;b++)
{
if(G.arcs[d][b].adj<20000&&P[a][b])
{
printf("-->%s",G.vex[b].sight);
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0) printf("\n");
goto gate;
}
}
}
}
}


void HaMiTonian(int m) //哈密尔顿图遍历,用来求推荐路线
{
if(m>9) return;
L: NextValue(m);
if(x[m]==0)
return;
if(m==7&&G.arcs[0][x[9]-1].adj!=20000)
display();
else
HaMiTonian(m+1);
goto L;
}


void NextValue(int k) //哈密顿函数中用到此函数
{
int j;
l:x[k]=(x[k]+1)%10;
if(x[k]==0)
return;
if(G.arcs[x[k-1]-1][x[k]-1].adj!=20000)
{
for(j=0;j<k;j++)
if(x[j]==x[k])
goto l;
return;
}
else
goto l;
}


void display()
{
int i=0;
printf("\n\n\t");
for(i=0;i<9;i++)
printf("%s->",G.vex[x[i]-1].sight);
printf("出口");
printf("\n");
}


这是 我的 代码 不过 第三个 功能 实现时 有错误 ,望大家 能够 帮我修改下,本人菜鸟 大家见谅!
rongfei3380 2010-01-07
  • 打赏
  • 举报
回复
不明白 能说 详细 一下吗 ?
bobo364 2010-01-07
  • 打赏
  • 举报
回复
也就是一个顶点有7个路径

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧