數據結構迷宮課程設計_第1頁
已閱讀1頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  數據結構課程設計</b></p><p><b>  說 明 書</b></p><p>  學 院: 信息科學與工程學院 </p><p>  班 級: 計算機科學與技術 2009級6班 </p><p>  完

2、成 人:姓 名: 學 號: </p><p>  指導教師: </p><p>  2010年12月31日</p><p>  課 程 設 計 任 務 書</p><p>  一、課程設計題目: 迷宮問題

3、 </p><p>  二、課程設計應解決的主要問題:</p><p>  (1) 實現一個以鏈表做存儲結構的隊列類型; </p><p>  (2) 編寫一個求解迷宮的非遞歸程序; </p><p> ?。?) 求得的通路以二元組的形式輸出,

4、寫清楚第幾步 </p><p> ?。?) 以方陣的形式輸出迷宮及其通路 </p><p>  三、任務發(fā)出日期: 2010-9-20 課程設計完成日期: 2011-01-07 </p><p><b>  小組分工說明</b></p><p&g

5、t;  小組編號 43 題 目: 迷宮問題 </p><p>  小組分工情況:獨自一人完成題目要求</p><p>  組長簽字: </p><p>  年 月 日</p><p>  指導教師對課程

6、設計的評價</p><p>  成績: </p><p>  指導教師簽字: </p><p>  年 月 日 </p><p><b>  目 錄</b></p><p>  需求分析說明 …………………………………

7、………51.1求迷宮通路的總體功能要求………………………………51.2主函數模塊……………………………………………………51.3隊列的存儲功能及輸出結點功能…………………………51.4構建迷宮找出迷宮的通路…………………………………5</p><p>  1.5 測試數據…………………………………………………………………………..6</p><p>  概要設計說明 …………………

8、…………………………………62.1 模板的調用說明………………………………………………62.2 隊列的抽象數據類型定義…………………………………62.3 基本操作及函數功能………………………………………6</p><p>  詳細設計說明 ……………………………………………………73.1 主函數模塊…………………………………………………73.2 隊列的存儲功能及輸出結點功能………………………73.3

9、構建迷宮找出迷宮的通路…………………………………8</p><p>  調試分析 …………………………………………………………8</p><p>  用戶使用說明 ……………………………………………………8</p><p>  5.1程序運行的初始界面………………………………………………….......9</p><p>  5.2迷宮可通時

10、的界面……………………………………………………….10</p><p>  5.3迷宮不可通時的界面………………………………………………….11</p><p>  5.4迷宮沒有入口時的界面……………………………………………...12</p><p>  6課程設計總結 ……………………………………………………12</p><p>  7測

11、試結果 ……………………………………………….13</p><p>  8參考書目………………………………………………..13</p><p>  9程序代碼………………………………………………..14</p><p><b>  需求分析說明</b></p><p>  求迷宮通路的總體功能要求:</p>

12、<p>  求迷宮中從入口到出口的所有路徑。由于計算機解迷宮時通常用的是“窮舉求解”的方法,即從入中出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走否則沿原路退回,換一個方向再繼續(xù)探索,直至所有可能 的通路都探索到為止。</p><p><b>  基本功能如下:</b></p><p> ?、?界面友好,易于操作。利用提示完成走出迷宮的任務。</p

13、><p>  ⑵ 實現以鏈表作存儲結構的隊列類型。</p><p>  ⑶ 實現建立一個隨機的迷宮,并且走出迷宮的操作。</p><p>  以下是各功能模塊的功能描述:</p><p><b>  1.主函數模塊</b></p><p>  本模塊的主要功能是初始化圖形界面,調用各模塊,實現走出迷宮

14、的功能。</p><p>  2.隊列的存儲功能及輸出結點功能</p><p>  本模塊的主要功能是建立隊列,實現隊列的各個基本操作,如構建一個空隊列,往隊尾插入元素,刪除隊頭元素,取隊尾元素,取隊頭元素,判斷隊列是否為空,遍歷隊鏈的每個元素,輸出每個元素,銷毀隊鏈。</p><p>  3.構建迷宮找出迷宮的通路</p><p>  本模

15、塊的主要功能是隨機初始化一個迷宮并輸出,實現走出迷宮的操作,再輸出走完后的迷宮及走出迷宮所走的路徑。</p><p><b>  測試數據</b></p><p>  1. (1,5) (4,8)</p><p>  2. (0,0) (9,9)</p><p>  3. (11,11)(11,11)</p>

16、<p><b>  概要設計說明</b></p><p><b>  模板調用說明:</b></p><p>  隊列的抽象數據類型定義為:</p><p>  ADT Queue{</p><p>  數據對象: D={Ai | Ai ∈ElemSet,i=1,2,…,n, n&g

17、t;=0}數據關系:R1={<Ai-1,Ai>|Ai-1,Ai∈D,i=1,2,…,n}}</p><p>  約定其中a1端為隊列頭,an端為隊列尾。</p><p><b>  基本操作:</b></p><p>  Status InitQueue (LinkQueue &Q)//構造一個空隊列Q,隊列有一個頭結點&

18、lt;/p><p>  Status DestroyQueue(LinkQueue &Q) //銷毀隊列Q</p><p>  Status EnQueue(LinkQueue &Q,QElemType e)//插入元素e為Q的新的隊尾元素</p><p>  Status DeQueue(LinkQueue &Q,QElemType

19、&e)//若隊列不空,則刪除Q的對頭元素,用e返回其值,并返回OK;否則返回ERROR</p><p>  Status GetHead(LinkQueue Q,QElemType &e)//若隊列不空,則用e返回Q的隊頭元素,并返回OK;否則返回ERROR</p><p>  Status GetRear(LinkQueue Q,QElemType &e)//若隊

20、列不空,則用e返回Q的隊尾元素,并返回OK;否則返回ERROR</p><p>  Status DeRear(LinkQueue &Q,QElemType &e)//若隊列不空,利用循環(huán)彈出Q的隊尾元素,并返回OK;否則返回ERROR</p><p>  Status QueueEmpty(LinkQueue Q)//若隊列Q為空隊列,則返回TURE,否則返回FALSE&

21、lt;/p><p>  Status QueueTraverse(LinkQueue Q,Status (*visit)(QElemType))//從隊頭到隊尾依次對隊列Q中每個元素調用函數visit()。一旦visit失敗,則操作失敗</p><p>  Status PrintQElem (QElemType e)//輸出隊列中的元素</p><p>  Statu

22、s MakeMaze(MazeType &maze)//生成迷宮,"0"表示通PATH,"1"表示不通WALL</p><p>  void PrintMaze(MazeType maze)//把迷宮輸出</p><p>  PosType Nextpos(PosType position,ElemType direction)移動到下一格,

23、向下走一步</p><p>  StatusPassMaze(MazeType&maze,PosTypestart,PosTypeend,LinkQueue &Q)//找出迷宮的一條通路</p><p>  void main()//主函數,調用各個子函數</p><p><b>  詳細設計說明</b></p>

24、<p><b>  1.主函數模塊</b></p><p>  首先調用InitQueue函數,構造一個空隊列,然后調用MakeMaze函數,隨機生成一個迷宮,再調用PrintMaze函數,讓迷宮顯示在屏幕上,讓用戶輸入迷宮的入口和出口,再調用PassMaze,判斷迷宮是否有通路,如有則輸出迷宮可通及所走路徑。如沒有則輸出迷宮不可通及所走路徑。最后銷毀隊列,退出程序。</p&

25、gt;<p>  2.隊列的存儲功能及輸出結點功能</p><p>  在實現隊列的存儲功能時,首先定義單鏈隊列的鏈式存儲結構,然后定義隊列的各種基本操作的函數,其中定義的函數有構造一個空隊列的函數InitQueue,銷毀隊列的函數DestroyQueue,向隊尾插入元素的函數EnQueue,刪除隊頭元素的函數DeQueue,取隊頭元素的函數GetHead,利用循環(huán)彈出隊尾元素的函數DeRear,判

26、斷隊列是否為空的函數QueueEmpty。</p><p>  在實現輸出隊列的結點功能時,定義了從隊頭到隊尾依次對隊列中每個元素調用函數visit()的遍歷函數QueueTraverse,及輸出隊列元素的輸出函數PrintQElem。</p><p>  3.構建迷宮找出迷宮的通路</p><p>  在實現構建迷宮的功能中,利用srand(time(NULL))

27、使計算機自動讀取自己的時鐘獲得SEED值,獲得真正的隨機數,利用循環(huán)調用函數rand()再對2取余,只獲得數0和1也就是迷宮中的墻和通路,再調用函數PrintQElem輸出初始迷宮。調用函數Nextpos,找通路的時候向前走一步,再調用函數PassMaze,找出迷宮的一條通路。 </p><p><b>  調試分析</b></p><p>  我在調試程序的過程中遇

28、到的問題是當迷宮的路可通時,輸出的所走路徑是亂碼,主要問題是如果判斷出一個通道塊不可通時,已經把它放入隊列當中,如果再把它彈出時不能像棧那個樣直接調用出棧函數,因為棧是先進后出的存儲結構,最新壓入的元素就能直接取出,而對于隊列來說新入隊的元素放在了隊尾,而出隊函數是把隊頭元素給輸出,不是新入隊的元素。因此,如果要用隊列模擬棧的功能,要解決的問題是,從隊頭開始依次將隊列的隊頭元素給輸出,再把該元素放入隊列當中,只到遇到新插入的元素,只把它

29、彈出,就是把那個不可通的通道給彈出了,再往后退一步。修改過這個地方之后當路徑可通時,輸出的所走路徑就不是亂碼而是真正所走的通道塊坐標。</p><p><b>  用戶使用說明</b></p><p>  編譯程序,出現有迷宮的界面,如下圖1所示,按提示輸入迷宮的入口位置坐標和出口位置坐標,再運行程序。如果迷宮有通路會輸出“迷宮可通,路徑蹤跡如下:”,輸出走過之后的迷

30、宮,然后再輸出具體路徑,如下圖2所示。如果迷宮不可通時,會輸出“迷宮不可通,路徑蹤跡如下:”,輸出走過之后的迷宮,如下圖3所示。如果迷宮沒有入口時,會輸出“當前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”輸出迷宮,如下圖4所示。</p><p>  程序運行的初始界面:</p><p><b>  圖1</b></p><p><b&g

31、t;  迷宮可通時的界面:</b></p><p><b>  圖2</b></p><p>  迷宮不可通時的界面:</p><p><b>  圖3</b></p><p>  迷宮沒有入口時的界面:</p><p><b>  圖4</b&g

32、t;</p><p><b>  課程設計總結</b></p><p>  通過這次的課程設計作業(yè),讓我真正的知道了棧的先進后出的存儲結構特點和隊列的先進先出的存儲結構特點的區(qū)別,而做迷宮求解的問題當中最好用的存儲結構是棧,如果用隊列做為存儲結構,就要利用循環(huán)來讓隊列模擬棧的先進后出的存儲結構特點。</p><p>  還讓我知道了用計算機求解

33、迷宮時,用的是“窮舉求解”的方法,即從入中出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走;否則沿原路退回,換一個方向再繼續(xù)探索,直至所有可能的通路都探索到為止。為了保證在任何位置上都能沿原路退回,顯然需要用一個后進先出的結構來保存從入口到當前位置的路徑。因此,在求迷宮通路的算法中最好是應用“?!保绻谩瓣犃小钡脑?,就要用隊列來模擬棧的存儲結構特點。</p><p><b>  測試結果</b

34、></p><p>  輸入(0,0)到(9,9)時,輸出結果為:“當前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”并輸出迷宮。</p><p>  輸入(11,11)到(11,11)時,輸出結果為:“當前迷宮沒有入口”,“迷宮不可通,路徑蹤跡如下:”并輸出迷宮。</p><p>  輸入(1,1)到(8,7)時,輸出結果為:“迷宮可通,路徑蹤跡如下:”并輸

35、出走過之后的迷宮及具體路徑。</p><p>  輸入(1,1)到(6,6)時,輸出結果為:“迷宮不可通,路徑足跡如下:”并輸出走過之后的迷宮。</p><p><b>  參考書目</b></p><p>  數據結構(C語言版)嚴蔚敏 吳偉民 清華大學出版社</p><p>  數據結構題集(C語言版)嚴蔚敏 吳偉民

36、 米寧 清華大學出版社 </p><p><b>  程序代碼</b></p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #include<stdlib.h></p><p> 

37、 #include<time.h></p><p>  #include<math.h></p><p><b>  //函數狀態(tài)碼定義</b></p><p>  #define TRUE 1</p><p>  #define FALSE 0</p>&

38、lt;p>  #define OK 1</p><p>  #define ERROR 0</p><p>  #define INFEASIBLE -1</p><p>  #define NULL 0 </p><p>  //墻或通路及前進方向符號定義</p><

39、p>  #define WALL 0 //代表當前格子是墻</p><p>  #define PATH 1 //代表是通路且未走過</p><p>  #define RIGHT -1 //代表是通路且從其向右走</p><p>  #define DOWN -2 //代表是通路且從其向下走&l

40、t;/p><p>  #define LEFT -3 //代表是通路且從其向左走</p><p>  #define UP -4 //代表是通路且從其向上走</p><p>  #define BACK -5 //代表是通路且從其后退一步</p><p>  #define DESTINATION -

41、6 //代表當前格子是通路且是目標位置</p><p>  typedef int MazeType[10][10]; //最外鑿初始化成墻,實際含8*8個格子</p><p>  typedef int Status;</p><p>  typedef int ElemType; //迷宮數組中的元素類型</p><p>  //---

42、------單鏈隊列--隊列的鏈式存儲結構-----//</p><p>  typedef struct</p><p><b>  {</b></p><p><b>  int x;</b></p><p><b>  int y;</b></p><

43、p>  }PosType;//迷宮中坐標的位置</p><p>  typedef struct{</p><p>  int ord; //通道塊在路徑上的序號</p><p>  PosType seat; //通道塊在迷宮中的坐標位置</p><p> 

44、 int di; //從此通道塊走向下一通道塊的方向</p><p>  }QElemType; //隊列中元素類型</p><p>  typedef struct QNode</p><p><b>  {</b></p><p>  

45、QElemType data;</p><p>  struct QNode *next;</p><p>  }QNode,*QueuePtr; //隊列結點</p><p>  typedef struct</p><p><b>  {</b></p><p>  Queu

46、ePtr front; //隊頭指針</p><p>  QueuePtr rear; //隊尾指針</p><p>  }LinkQueue;</p><p>  Status InitQueue (LinkQueue &Q) //構造一個空隊列Q,隊列有一個頭結點</p><p><b>  {&

47、lt;/b></p><p>  Q.front=(QueuePtr)malloc(sizeof(QNode));</p><p>  Q.rear=Q.front;</p><p>  if(!Q.front) exit(OVERFLOW); //存儲分配失敗</p><p>  Q.front->next=NULL;

48、</p><p>  return OK;</p><p>  }//InitQueue</p><p>  Status DestroyQueue(LinkQueue &Q) //銷毀隊列Q</p><p><b>  {</b></p><p>  while(Q.front

49、)</p><p><b>  {</b></p><p>  Q.rear = Q.front->next;</p><p>  free(Q.front);</p><p>  Q.front = Q.rear;</p><p><b>  }</b></p&

50、gt;<p>  return OK;</p><p>  }//DestroyQueue</p><p>  Status EnQueue(LinkQueue &Q,QElemType e) //插入元素e為Q的新的對尾元素 </p><p><b>  {</b></p><p&

51、gt;  QueuePtr p;</p><p>  p=(QueuePtr)malloc(sizeof(QNode));</p><p>  if(!p) exit (OVERFLOW); //存儲分配失敗</p><p>  p->data = e;</p><p>  p->nex

52、t = NULL;</p><p>  Q.rear ->next = p;</p><p>  Q.rear = p;</p><p>  return OK;</p><p>  }//EnQueue</p><p>  Status DeQueue(LinkQueue &Q,QElemType &a

53、mp;e) </p><p><b>  {</b></p><p>  //若隊列不空,則刪除Q的對頭元素,用e返回其值,并返回OK;否則返回ERROR</p><p>  QueuePtr p;</p><p>  if (Q.front == Q.rear ) return ERROR;</p>

54、;<p>  p=Q.front ->next ;</p><p>  e=p->data ;</p><p>  Q.front ->next =p->next ;</p><p>  if(Q.rear == p) //判斷刪除后隊列是否為空</p><p>  Q.rear =Q.

55、front ; //隊列已為空</p><p><b>  free (p);</b></p><p>  return OK;</p><p>  }//DeQueue</p><p>  Status GetHead(LinkQueue Q,QElemType &e) </p>&

56、lt;p><b>  { </b></p><p>  //若隊列不空,則用e返回Q的隊頭元素,并返回OK;否則返回ERROR</p><p>  QueuePtr p;</p><p>  if(Q.rear ==Q.front ) return ERROR;</p><p>  p=Q.front->

57、;next; </p><p>  e=p->data ; //取隊頭元素</p><p>  return OK;</p><p>  }//GetHead</p><p>  Status GetRear(LinkQueue Q,QElemType &e) </p><p><b&g

58、t;  { </b></p><p>  //若隊列不空,則用e返回Q的隊尾元素,并返回OK;否則返回ERROR</p><p>  QueuePtr p;</p><p>  if(Q.rear ==Q.front ) return ERROR;</p><p>  p=Q.rear; </p><p

59、>  e=p->data ; //取隊尾元素</p><p>  return OK;</p><p>  }//GetRear</p><p>  Status DeRear(LinkQueue &Q,QElemType &e)</p><p>  {//若隊列不空,利用循環(huán)彈出Q的隊尾元素,并返回OK;否

60、則返回ERROR</p><p>  QueuePtr p;</p><p>  if(Q.rear ==Q.front ) return ERROR;</p><p><b>  p=Q.rear;</b></p><p>  while(Q.front->next!=p)</p><p

61、><b>  {</b></p><p>  DeQueue(Q,e); //刪除隊頭元素</p><p>  EnQueue(Q,e); //將刪除的隊頭元素插入隊尾</p><p><b>  }</b></p><p>  DeQueue(Q,e);

62、 //將原來的隊尾元素彈出,相當于棧的功能</p><p>  return OK;</p><p><b>  }//DeRear</b></p><p>  Status QueueEmpty(LinkQueue Q) </p><p><b>  {</b>&l

63、t;/p><p>  //若隊列Q為空隊列,則返回TURE,否則返回FALSE</p><p>  if(Q.rear == Q.front ) </p><p>  return TRUE;</p><p><b>  else </b></p><p>  return FALSE;<

64、;/p><p>  }//QueueEmpty</p><p>  Status QueueTraverse(LinkQueue Q,Status (*visit)(QElemType)) </p><p><b>  {</b></p><p>  //從隊頭到隊尾依次對隊列Q中每個元素調用函數visit()。一旦visi

65、t失敗,則操作失敗。</p><p>  QueuePtr p=Q.front->next ;</p><p>  if(Q.rear ==Q.front ) printf("空隊列\(zhòng)n");</p><p><b>  else</b></p><p>  while(p!=NULL )

66、</p><p><b>  {</b></p><p>  (*visit) (p->data );</p><p>  p=p->next;</p><p><b>  }</b></p><p>  return OK;</p><p&g

67、t;  }//QueueTraverse</p><p>  Status PrintQElem (QElemType e){</p><p>  printf("step:%d to (%d,%d)\n",e.ord,e.seat.x,e.seat.y);</p><p>  return OK;</p><p>  }

68、//PrintQElem</p><p>  //------------------- 迷宮求解的具體算法 ------------------//</p><p>  Status MakeMaze(MazeType &maze) </p><p><b>  {</b></p><p> 

69、 //生成迷宮,"0"表示通PATH,"1"表示不通WALL</p><p>  PosType m;</p><p>  srand(time(NULL)); //使計算機自動讀取自己的時間獲得SEED值,獲得真正的隨機數</p><p>  for(m.y=0;m.y<=9;m.y++)</p&

70、gt;<p><b>  {</b></p><p>  maze[0][m.y]=WALL;</p><p>  maze[9][m.y]=WALL;</p><p><b>  }</b></p><p>  for(m.x=1;m.x<=8;m.x++)</p>

71、;<p><b>  {</b></p><p>  maze[m.x][0]=WALL;</p><p>  maze[m.x][9]=WALL;</p><p><b>  }</b></p><p>  for(m.x=1;m.x<=8;m.x++)</p>

72、<p>  for(m.y=1;m.y<=8;m.y++)</p><p>  maze[m.x][m.y]=rand()%2;//隨機取到0到RAND_MAX之間的任何數,對2取余是只產生0,1,就是迷宮中的墻和路</p><p>  return OK;</p><p>  }//MakeMaze</p><p>  vo

73、id PrintMaze(MazeType maze)</p><p><b>  {</b></p><p><b>  //打印迷宮</b></p><p><b>  int x,y;</b></p><p>  printf(" ");</p&

74、gt;<p>  for(x=0;x<=9;x++)</p><p><b>  {</b></p><p>  printf(" %d",x);</p><p><b>  }</b></p><p>  printf("\n");<

75、;/p><p>  for(x=0;x<=9;x++)</p><p><b>  {</b></p><p>  printf("%d",x);</p><p>  for(y=0;y<=9;y++)</p><p><b>  {</b><

76、;/p><p>  switch(maze[x][y])</p><p><b>  {</b></p><p>  case WALL:printf("■");break;</p><p>  case PATH:printf(" ");break;</p><

77、p>  case RIGHT:printf("→");break;</p><p>  case DOWN: printf("↓");break;</p><p>  case LEFT: printf("←");break;</p><p>  case UP: printf("↑&q

78、uot;);break;</p><p>  case BACK: printf("@ ");break;</p><p>  case DESTINATION:printf("◎");break;</p><p>  default:printf("error\n");exit(-1);</p>

79、;<p><b>  }</b></p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  }//PrintMaze</p><p&g

80、t;  PosType Nextpos(PosType position,ElemType direction)</p><p><b>  {</b></p><p>  //移動到下一格,向下走一步</p><p>  PosType result;</p><p>  result=position;</p&

81、gt;<p>  switch (direction)</p><p><b>  {</b></p><p>  case 1:result.y++;break; //向右走</p><p>  case 2:result.x++;break; //向下走</p><p>  case 3:res

82、ult.y--;break; //向左走</p><p>  case 4:result.x--;break; //向上走</p><p><b>  }</b></p><p>  return result;</p><p>  }//Nextpos</p><p>  Status

83、PassMaze(MazeType &maze,PosType start,PosType end,LinkQueue &Q)</p><p><b>  {</b></p><p>  //找出迷宮的一條通路</p><p>  PosType curpos; //迷宮中的坐標</p><p>

84、  QElemType e;</p><p>  int curstep=1;</p><p>  curpos=start;</p><p>  if(maze[curpos.x][curpos.y]!=PATH) </p><p><b>  { </b></p><p>  printf(&

85、quot;當前迷宮沒有入口\n"); </p><p>  return FALSE;</p><p><b>  }</b></p><p><b>  do{ </b></p><p>  if(maze[curpos.x][curpos.y]==PATH) //當前位置可通&

86、lt;/p><p><b>  {</b></p><p>  e.ord=curstep; //走過的第幾步</p><p>  e.seat=curpos; //通道塊在迷宮中的坐標</p><p>  e.di=1; //將要往右走</p><p&g

87、t;  EnQueue(Q,e); //將坐標位置插入隊尾</p><p>  if(curpos.x==end.x&&curpos.y==end.y)</p><p><b>  {</b></p><p>  maze[curpos.x][curpos.y]=DESTINATION; //走出迷宮</p&

88、gt;<p>  return OK;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p>  maze[curpos.x][curpos.y]=RIGHT;

89、 //標志為從其向右走</p><p>  curpos=Nextpos(curpos,1); //坐標向右移動下個格</p><p>  curstep++;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else

90、 //當前位置不通</p><p><b>  {</b></p><p>  GetRear(Q,e);//返回隊尾元素</p><p>  while(!QueueEmpty(Q)&&e.di==4)</p><p><b>  {</b></p>

91、<p>  maze[e.seat.x][e.seat.y]=BACK; //標志為后退一步</p><p>  DeRear(Q,e); //將插入隊尾的元素彈出</p><p>  curstep--;</p><p>  if(QueueEmpty(Q)) break;</p><p>  GetRe

92、ar(Q,e); //取隊尾元素 </p><p><b>  }</b></p><p>  if(e.di<4) //隊尾位置有其他方向可以選擇</p><p><b>  { </b></p><p>  DeRear(Q,e); //彈出隊尾

93、元素</p><p><b>  e.di++; </b></p><p>  EnQueue(Q,e); //將新結點插入隊尾</p><p>  maze[e.seat.x][e.seat.y]=-e.di; //注意前進方向蹤跡與e.di互為相反數</p><p>  curpos=Nextpos(e.

94、seat,e.di);</p><p><b>  }</b></p><p><b>  }</b></p><p>  }while(!QueueEmpty(Q));</p><p>  return FALSE;</p><p>  }//PassMaze</p&

95、gt;<p>  void main(){</p><p>  MazeType maze;</p><p>  PosType start,end;</p><p>  LinkQueue Q;</p><p>  InitQueue(Q);</p><p>  MakeMaze(maze);</

96、p><p>  printf("初始迷宮為:\n");</p><p>  PrintMaze(maze);</p><p>  printf("輸入迷宮的入口位置坐標從(0,0)到(9,9): ");</p><p>  scanf("%d,%d",&start.x,&

97、start.y);</p><p>  printf("輸入迷宮的出口位置坐標從(0,0)到(9,9): ");</p><p>  scanf("%d,%d",&end.x,&end.y);</p><p>  if(PassMaze(maze,start,end,Q)) //找迷宮通路</p>

98、;<p><b>  {</b></p><p>  printf("迷宮可通,路徑蹤跡如下:\n");</p><p>  PrintMaze(maze); //輸出走過之后的迷宮</p><p>  printf("具體路徑為:\n");</p><p>

99、;  QueueTraverse(Q,PrintQElem); //遍歷隊列的每個元素并輸出</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("迷宮不可通,

100、路徑蹤跡如下:\n");</p><p>  PrintMaze(maze);</p><p><b>  }</b></p><p>  DestroyQueue(Q); //銷毀隊列</p><p>  printf("-------------輸入任意鍵結束---------------\

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論