求各位大神解答,校園導游咨詢還差第四小題,需要用到深度優先遍歷或者廣度優先遍歷(任選其一),我怎么打都打不起來,其他的代碼附上,(如果能給出代碼就更好啦。)謝謝!

8. 校園導游咨詢
問題描述:為本校設計一個校園導游咨詢程式,滿足以下要求(③、④的結果若能用TC的繪圖函式顯示則另加1分):
①校園地圖存盤于資料檔案中(格式自定,至少15個景點,25條邊),包括景點編號、名稱、簡介、景點間道路長度等資訊;
② 能根據“景點編號 / 名稱”查詢任意景點的相關資訊;
③ 在用戶指定出發和目的景點后,能提供兩景點間的最短路徑資訊;
④ 能為用戶提供從指定景點出發游覽完其他所有景點的路線資訊。
[code=c][/code]
代碼如下:#include "string.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define Max 20000 //表示邊的極大值
#define NUM 16 //最大頂點數
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[16]={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,11); //采用鄰接矩陣表示法創建無向網
do
{
ck=Menu(); //根據Menu選單里選擇自己想要的功能
switch(ck)
{
case '1':search();break; //查詢景點的相關資訊
case '2':
system("cls");
narrate();
printf("\n\n\t\t\t請選擇出發景點(0~15):");
scanf("%d",&v0);
printf("\t\t\t請選擇目的景點(0~15):");
scanf("%d",&v1);
ShortestPath(v0);
output(v0,v1);
printf("\n\n\t\t\t\t請按任意鍵繼續...\n");
getchar();
getchar();
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");
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("\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\t請輸入您的選擇:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);//當輸入了1或2或e時flag=0,flag=0時會有回傳值,回傳相應的值c,c是用戶希望的查詢要求的序號
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按任意鍵回傳...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t沒有找到!");
printf("\n\n\t\t\t按任意鍵回傳...");
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按任意鍵回傳...");
getchar();
getchar();
break;
}
}
if(i==NUM)
{
printf("\n\n\t\t\t沒有找到!");
printf("\n\n\t\t\t按任意鍵回傳...");
getchar();
getchar();
}
break;
}
}while(c!='e');
}
void CreateUDN(int v,int a) //采用鄰接矩陣表示法創建無向網
{
int i,j;
G.vexnum=v; //圖的總頂點數v
G.arcnum=a; //圖的總邊數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="教室,自習室";
G.vex[10].sight="籃球場";
G.vex[10].description="打籃球場所";
G.vex[11].sight="操場";
G.vex[11].description="運動場所";
G.vex[12].sight="藝術樓";
G.vex[12].description="藝術學院教學樓";
G.vex[13].sight="實驗樓一區";
G.vex[13].description="學生做實驗的場所";
G.vex[14].sight="實驗樓二區";
G.vex[14].description="學生做實驗的場所";
G.vex[15].sight="校園超市";
G.vex[15].description="購物休閑場所";
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
{G.arcs[i][j].adj=Max;} //初始化鄰接矩陣,邊的權值均置為極大值
/*依次輸入景點到景點間的路徑長度,即邊的權值*/
G.arcs[0][2].adj=G.arcs[2][0].adj=130;
G.arcs[0][12].adj=G.arcs[12][0].adj=130;
G.arcs[1][4].adj=G.arcs[4][1].adj=200;
G.arcs[1][14].adj=G.arcs[14][1].adj=400;
G.arcs[2][9].adj=G.arcs[9][2].adj=50;
G.arcs[2][12].adj=G.arcs[12][2].adj=100;
G.arcs[2][3].adj=G.arcs[3][2].adj=30;
G.arcs[3][8].adj=G.arcs[8][3].adj=900;
G.arcs[3][9].adj=G.arcs[9][3].adj=50;
G.arcs[3][10].adj=G.arcs[10][3].adj=400;
G.arcs[4][6].adj=G.arcs[6][4].adj=60;
G.arcs[4][9].adj=G.arcs[9][4].adj=100;
G.arcs[5][7].adj=G.arcs[7][5].adj=100;
G.arcs[5][11].adj=G.arcs[11][5].adj=200;
G.arcs[6][10].adj=G.arcs[10][6].adj=100;
G.arcs[7][15].adj=G.arcs[15][7].adj=500;
G.arcs[8][15].adj=G.arcs[15][8].adj=300;
G.arcs[9][13].adj=G.arcs[13][9].adj=120;
G.arcs[10][11].adj=G.arcs[11][10].adj=50;
G.arcs[12][13].adj=G.arcs[13][12].adj=50;
G.arcs[13][14].adj=G.arcs[14][13].adj=50;
}
void narrate()
{
int i,k=0;
printf("\n\t\t**************歡迎使用校園導游咨詢*************\n");
printf("\n\t\t***************************************\n");
printf("\t__________________________________________________________________\n");
printf("\t\t景點名稱\t\t\t景點描述\n");
printf("\t__________________________________________________________________\n");
for(i=0;i<NUM;i++)
{
printf("\t (%2d)%-10s\t\t\t\t%-25s\n",i,G.vex[i].sight,G.vex[i].description);
k=k+1;
}
printf("\t__________________________________________________________________\n");
} //顯示出景點名稱和相對應景點描述的選單
void ShortestPath(int num) //最短路徑 出發景點v0=num
{
int v,w,i,t;
int final[NUM];
int min;
for(v=0;v<NUM;v++) //依次遍歷景點的相應編號0~15
{
final[v]=0;
D[v]=G.arcs[num][v].adj; //如果輸入的出發景點和別的景點有路徑,則把相應的權值存入到陣列D[v]中
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>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");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/239336.html
標籤:C語言
上一篇:求大佬,存數問題
