主頁 > 後端開發 > 資料結構(圖的遍歷)

資料結構(圖的遍歷)

2020-12-24 05:25:25 後端開發

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

上一篇:求大佬,存數問題

下一篇:strlen() 和 sizeof() 的回傳值size_t 是無符號長整型?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more