2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告</p><p><b>  題目:迷宮問題</b></p><p><b>  姓名:</b></p><p><b>  學(xué)號:</b></p><p><b>  班級:</b></p><

2、;p><b>  指導(dǎo)教師:</b></p><p><b>  2012年6月6日</b></p><p><b>  問題描述</b></p><p>  輸入任意大小的迷宮數(shù)據(jù),用遞歸和非遞歸方法求出一條走出迷宮的路徑,并將路徑輸出。</p><p><b&g

3、t;  設(shè)計(jì)思路</b></p><p>  以 0和1分別表示迷宮中的通路和障礙,沒有通路則不顯示。未顯示為得出沒有通路的結(jié)論;</p><p>  走迷宮的方式是一個(gè)一個(gè)的線路去試 如果是死路的話就退回去,類似數(shù)據(jù)結(jié)構(gòu)中棧的先進(jìn)后出,所以可以用棧這種結(jié)構(gòu)表示迷宮,通過不斷的試驗(yàn)當(dāng)試出最后的路線時(shí)輸出棧即可,由于它是不斷循環(huán)的實(shí)驗(yàn),所以可以采用鏈棧實(shí)現(xiàn)迷宮的求解。同時(shí)因?yàn)槊詫m

4、需要不斷重復(fù)的試驗(yàn),可以看成反復(fù)的調(diào)用“迷宮“這個(gè)函數(shù),這是典型的遞歸問題,所以也可以使用遞歸解決問題。另外由于數(shù)據(jù)對象是迷宮所以可以用0和1構(gòu)建不同類型的迷宮更符合實(shí)際也更有樂趣。</p><p><b>  數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)</b></p><p>  前面提到要用到鏈棧和遞歸兩種方式操作;為了更好的以鏈表作存儲結(jié)構(gòu)的棧,可以用二維數(shù)組存儲迷宮信息,同時(shí)通路以三元組(

5、i,j,d)的形式輸出,其中:(i,j)指示迷宮中的一個(gè)坐標(biāo),d表示走到下一個(gè)坐標(biāo)的方向。這樣是路徑更加明顯,具體的數(shù)據(jù)結(jié)構(gòu)為:</p><p>  #define maxsize 100</p><p>  #define NULL 0</p><p>  typedef struct//定義迷宮</p><p><b&g

6、t;  {</b></p><p>  int Maze[maxsize][maxsize];//二維數(shù)組存放迷宮信息</p><p>  int maze_x,maze_y;//迷宮的行數(shù)和列數(shù)</p><p><b>  }maze;</b></p><p>  typedef struct

7、point//鏈棧的每個(gè)結(jié)點(diǎn)定義</p><p><b>  {</b></p><p>  int vex_x,vex_y;//結(jié)點(diǎn)的橫縱坐標(biāo)</p><p>  int direction;//下一個(gè)結(jié)點(diǎn)的方向</p><p>  struct point *next;//指向下一個(gè)

8、結(jié)點(diǎn)</p><p><b>  }Point;</b></p><p>  遞歸法像一位手握大權(quán)的領(lǐng)導(dǎo)。當(dāng)他站在迷宮入口處時(shí),他才懶得親自去走,這時(shí)這位領(lǐng)導(dǎo)會吩咐他的手下,讓他們分別向著迷宮的各個(gè)方向去探索;當(dāng)遇到岔路口時(shí)留一個(gè)人守在這里,再分出幾股人,朝著每個(gè)方向繼續(xù)探索;最后總會有一個(gè)人發(fā)現(xiàn)出口。發(fā)現(xiàn)出口的這個(gè)人將出口的位置報(bào)告給離他最近的路口處留守的人,再由這

9、個(gè)人報(bào)告給上一個(gè)路口的人,依次層層上報(bào),最后消息傳到了領(lǐng)導(dǎo)那里,于是這位領(lǐng)導(dǎo)就順著這條畫好的通路大搖大擺地通過了迷宮。所以具體的數(shù)據(jù)結(jié)構(gòu)為:</p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #define maxsize 100</p><

10、;p>  #define NULL 0</p><p>  typedef struct//定義迷宮</p><p><b>  {</b></p><p>  int Maze[maxsize][maxsize];//二維數(shù)組存放迷宮信息</p><p>  int maze_x,maze_y;

11、//迷宮的行數(shù)和列數(shù)</p><p><b>  }maze;</b></p><p><b>  maze a;</b></p><p>  typedef struct point//鏈棧的每個(gè)結(jié)點(diǎn)定義</p><p><b>  {</b></p>

12、;<p>  int vex_x,vex_y;//結(jié)點(diǎn)的橫縱坐標(biāo)</p><p>  int direction;//下一個(gè)結(jié)點(diǎn)的方向</p><p>  struct point *next;//指向下一個(gè)結(jié)點(diǎn)</p><p><b>  }Point;</b></p><p>

13、<b>  4.功能函數(shù)設(shè)計(jì)</b></p><p>  <1>一個(gè)用于存放迷宮信息的二維數(shù)組maze[][]</p><p><b>  相關(guān)操作:</b></p><p>  a.二維數(shù)組的初始化maze creat()</p><p>  b.數(shù)組以指針形式在各個(gè)函數(shù)中傳遞。<

14、;/p><p>  c.可以改變數(shù)組中的行數(shù)和列數(shù)。</p><p>  <2>結(jié)構(gòu)體point *next:指向下一個(gè)結(jié)點(diǎn)</p><p>  <3>結(jié)構(gòu)體printmazepath:輸出迷宮路徑。</p><p>  <4>結(jié)構(gòu)體secret:搜索迷宮路徑。</p><p><

15、b>  5.編碼實(shí)現(xiàn)</b></p><p><b>  非遞歸:</b></p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #define maxsize 100</p><

16、p>  #define NULL 0</p><p>  typedef struct</p><p><b>  {</b></p><p>  int Maze[maxsize][maxsize];</p><p>  int maze_x,maze_y;</p><p><b&g

17、t;  }maze;</b></p><p>  typedef struct point </p><p><b>  {</b></p><p>  int vex_x,vex_y; </p><p>  int direction;

18、 </p><p>  struct point *next; </p><p><b>  }Point;</b></p><p>  maze creat()</p><p><b>  {</b></p><p><b>  i

19、nt i,j;</b></p><p><b>  maze a;</b></p><p>  printf("hang shu he lei shu:");</p><p>  scanf("%d%d",&a.maze_x,&a.maze_y);</p><

20、;p>  for(i=1;i<=a.maze_x;i++)</p><p><b>  {</b></p><p>  printf("shu ru %d hang:",i);</p><p>  for(j=1;j<=a.maze_y;j++)</p><p>  scanf(&q

21、uot;%d",&a.Maze[i][j]);</p><p><b>  }</b></p><p><b>  return a;</b></p><p><b>  }</b></p><p>  int found(int x,int y,Point

22、*head) {</p><p>  Point *p=head;</p><p><b>  while(p)</b></p><p><b>  {</b></p><p>  if(x==p->vex_x&&y==p->vex_y)</p><p

23、><b>  return 1;</b></p><p>  p=p->next;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p>&

24、lt;p>  Point *secret(maze a) </p><p><b>  {</b></p><p>  Point *top,*p; </p><p>  int j,m,x,y;</p><p>  p=(Point *)

25、malloc(sizeof(Point));</p><p>  p->vex_x=1;</p><p>  p->vex_y=1;</p><p>  p->next=NULL;</p><p><b>  top=p;</b></p><p><b>  j=1;&

26、lt;/b></p><p><b>  do</b></p><p><b>  {</b></p><p>  while(j<=4)</p><p><b>  {</b></p><p><b>  m=0;</b&g

27、t;</p><p>  x=top->vex_x;</p><p>  y=top->vex_y;</p><p><b>  switch(j)</b></p><p><b>  {</b></p><p>  case 1:if(y+1<=a.maz

28、e_y&&!a.Maze[x][y+1]&&!found(x,y+1,top))</p><p><b>  {</b></p><p>  p=(Point *)malloc(sizeof(Point));</p><p>  p->vex_x=x;p->vex_y=y+1;</p>

29、<p>  p->next=top;</p><p>  top->direction=j;</p><p>  top=p;m=1;</p><p><b>  }</b></p><p><b>  break;</b></p><p>  case

30、 2:if(x+1<=a.maze_x&&!a.Maze[x+1][y]&&!found(x+1,y,top))</p><p><b>  {</b></p><p>  p=(Point *)malloc(sizeof(Point));</p><p>  p->vex_x=x+1;p->v

31、ex_y=y;</p><p>  p->next=top;</p><p>  top->direction=j;</p><p>  top=p;m=1;</p><p><b>  }</b></p><p><b>  break;</b></p&g

32、t;<p>  case 3:if(y-1<=a.maze_y&&!a.Maze[x][y-1]&&!found(x,y-1,top))</p><p><b>  {</b></p><p>  p=(Point *)malloc(sizeof(Point));</p><p>  p-&g

33、t;vex_x=x;p->vex_y=y-1;</p><p>  p->next=top;</p><p>  top->direction=j;</p><p>  top=p;m=1;</p><p><b>  }</b></p><p><b>  break

34、;</b></p><p>  case 4:if(x-1<=a.maze_x&&!a.Maze[x-1][y]&&!found(x-1,y,top))</p><p><b>  {</b></p><p>  p=(Point *)malloc(sizeof(Point));</p&g

35、t;<p>  p->vex_x=x-1;p->vex_y=y;</p><p>  p->next=top;</p><p>  top->direction=j;</p><p>  top=p;m=1;</p><p><b>  }</b></p><p&

36、gt;<b>  break;</b></p><p><b>  }</b></p><p><b>  if(m!=0)</b></p><p>  {j=1;break;}</p><p><b>  else j++;</b></p>

37、<p><b>  }</b></p><p><b>  if(j>4)</b></p><p><b>  {</b></p><p>  if(top!=NULL)</p><p><b>  {</b></p>&l

38、t;p>  top=top->next;</p><p>  if(top==NULL)return NULL;</p><p>  j=top->direction+1;top->direction=j;</p><p><b>  }</b></p><p><b>  }</

39、b></p><p>  }while(top->vex_x!=a.maze_x||top->vex_y!=a.maze_y);</p><p>  if(top->vex_x==a.maze_x&&top->vex_y==a.maze_y)top->direction=0;</p><p>  return to

40、p;</p><p><b>  }</b></p><p>  int print(Point *p)</p><p><b>  {</b></p><p>  int i=0,top=0;</p><p>  Point *stack[maxsize];</p&g

41、t;<p>  if(p==NULL) </p><p><b>  {</b></p><p>  printf("bu neng dao da lu kou!\n");</p><p><b>  return 0;</b></p><p><b> 

42、 }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("shu chu lu jing(san yuan zu biao shi):\n");</p><p>  while(p!=NUL

43、L)</p><p><b>  {</b></p><p>  stack[top++]=p;</p><p>  p=p->next;</p><p><b>  }</b></p><p>  while(top>0)</p><p>

44、;<b>  {</b></p><p><b>  top--;</b></p><p>  printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction);</p><p><b&g

45、t;  i++;</b></p><p>  if(i%8==0)printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("\n");</p>&l

46、t;p><b>  return 1;</b></p><p><b>  }</b></p><p>  void printmazepath(Point *p,maze road)</p><p><b>  {</b></p><p><b>  int

47、i,j;</b></p><p>  char m[maxsize][maxsize];</p><p>  printf("lu jing tu shi:\n");</p><p>  for(i=1;i<=road.maze_x;i++)</p><p>  for(j=1;j<=road.ma

48、ze_y;j++)</p><p><b>  {</b></p><p>  if(road.Maze[i][j])m[i][j]='1';</p><p>  else m[i][j]='0';</p><p><b>  }</b></p><

49、;p><b>  while(p)</b></p><p><b>  {</b></p><p>  switch(p->direction)</p><p><b>  {</b></p><p>  case 0:m[p->vex_x][p->ve

50、x_y]=1;break;</p><p>  case 1:m[p->vex_x][p->vex_y]=26;break;</p><p>  case 2:m[p->vex_x][p->vex_y]=25;break;</p><p>  case 3:m[p->vex_x][p->vex_y]=27;break;</p

51、><p>  case 4:m[p->vex_x][p->vex_y]=24;break;</p><p><b>  }</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  for(i=1;i<=

52、road.maze_x;i++)</p><p>  for(j=1;j<=road.maze_y;j++)</p><p><b>  {</b></p><p>  printf("%c",m[i][j]);</p><p>  if(j<road.maze_y)printf(&quo

53、t; ");</p><p>  else printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</

54、b></p><p>  maze road;</p><p><b>  Point *p;</b></p><p>  road=creat();</p><p>  p=secret(road);</p><p>  if(print(p))printmazepath(p,road);

55、</p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  遞歸</b></p><p>  #include<stdio.h></p><p>  #include<ma

56、lloc.h></p><p>  #define maxsize 100</p><p>  #define NULL 0</p><p>  typedef struct</p><p><b>  {</b></p><p>  int Maze[maxsize][maxsize];&

57、lt;/p><p>  int maze_x,maze_y;</p><p><b>  }maze;</b></p><p><b>  maze a;</b></p><p>  typedef struct point</p><p><b>  {</b&

58、gt;</p><p>  int vex_x,vex_y;</p><p>  int direction;</p><p>  struct point *next;</p><p><b>  }Point;</b></p><p>  maze creat()</p><

59、;p><b>  {</b></p><p><b>  int i,j;</b></p><p><b>  maze a;</b></p><p>  printf("shu ru hang he lie:");</p><p>  scanf(&

60、quot;%d%d",&a.maze_x,&a.maze_y);</p><p>  for(i=1;i<=a.maze_x;i++)</p><p><b>  {</b></p><p>  printf("shu ru di %d hang:",i);</p><p&

61、gt;  for(j=1;j<=a.maze_y;j++)</p><p>  scanf("%d",&a.Maze[i][j]);</p><p><b>  }</b></p><p><b>  return a;</b></p><p><b> 

62、 }</b></p><p>  int found(int x,int y,Point *head)</p><p><b>  {</b></p><p>  Point *p=head;</p><p><b>  while(p)</b></p><p>

63、<b>  {</b></p><p>  if(x==p->vex_x&&y==p->vex_y)</p><p><b>  return 1;</b></p><p>  p=p->next;</p><p><b>  }</b><

64、;/p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  int k=1;</b></p><p>  int print(Point *p)</p><p><b>  {<

65、/b></p><p>  int i=0,top=0;</p><p>  Point *stack[maxsize];</p><p>  if(p==NULL) {printf("bu neng dao da!\n");return 0;}</p><p><b>  else</b>&l

66、t;/p><p><b>  {</b></p><p>  printf("shu chu di %d tiao mi gong lu jing(san yuan zu):\n",k++);</p><p>  while(p!=NULL)</p><p><b>  {</b>&

67、lt;/p><p>  stack[top++]=p;if(top==1)stack[top-1]->direction=0;</p><p>  p=p->next;</p><p><b>  }</b></p><p>  while(top>0)</p><p><b&

68、gt;  {</b></p><p><b>  top--;</b></p><p>  printf("(%d,%d,%d)",stack[top]->vex_x,stack[top]->vex_y,stack[top]->direction);</p><p><b>  i++

69、;</b></p><p>  if(i%8==0)printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("\n");</p><p>

70、<b>  return 1;</b></p><p><b>  }</b></p><p>  void printmazepath(Point *p,maze road)</p><p><b>  {</b></p><p><b>  int i,j;<

71、;/b></p><p>  char m[maxsize][maxsize];</p><p>  printf("mi gong lu jing tu shi :\n");</p><p>  for(i=1;i<=road.maze_x;i++)</p><p>  for(j=1;j<=road.

72、maze_y;j++)</p><p><b>  {</b></p><p>  if(road.Maze[i][j])m[i][j]='1';</p><p>  else m[i][j]='0';</p><p><b>  }</b></p>&

73、lt;p><b>  while(p)</b></p><p><b>  {</b></p><p>  switch(p->direction)</p><p><b>  {</b></p><p>  case 0:m[p->vex_x][p->

74、vex_y]=1;break;</p><p>  case 1:m[p->vex_x][p->vex_y]=26;break;</p><p>  case 2:m[p->vex_x][p->vex_y]=25;break;</p><p>  case 3:m[p->vex_x][p->vex_y]=27;break;<

75、/p><p>  case 4:m[p->vex_x][p->vex_y]=24;break;</p><p><b>  }</b></p><p>  p=p->next;</p><p><b>  }</b></p><p>  for(i=1;i<

76、;=road.maze_x;i++)</p><p>  for(j=1;j<=road.maze_y;j++)</p><p><b>  {</b></p><p>  printf("%c",m[i][j]);</p><p>  if(j<road.maze_y)printf(&q

77、uot; ");</p><p>  else printf("\n");</p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  i

78、nt sign=0;</p><p>  void mazepath(Point *p,int j)</p><p><b>  {</b></p><p>  int x,y,i;</p><p><b>  Point *q;</b></p><p>  x=p->

79、vex_x;y=p->vex_y;</p><p><b>  switch(j)</b></p><p><b>  {</b></p><p><b>  case 1:</b></p><p>  if(y+1<=a.maze_y&&!foun

80、d(x,y+1,p)&&!a.Maze[x][y+1])</p><p><b>  {</b></p><p>  q=(Point*)malloc(sizeof(Point));</p><p>  q->vex_x=x;q->vex_y=y+1;q->next=p;</p><p>

81、;  p->direction=j;</p><p>  if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b>  {</b></p><p>  if(print(q))printmazepath(q,a);sign=1;</p><

82、p><b>  }</b></p><p>  else for(i=1;i<=4;i++)</p><p>  mazepath(q,i);</p><p><b>  }</b></p><p><b>  break;</b></p><p

83、><b>  case 2:</b></p><p>  if(x+1<=a.maze_x&&!found(x+1,y,p)&&!a.Maze[x+1][y])</p><p><b>  {</b></p><p>  q=(Point*)malloc(sizeof(Point

84、));</p><p>  q->vex_x=x+1;q->vex_y=y;q->next=p;</p><p>  p->direction=j;</p><p>  if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b> 

85、 {</b></p><p>  if(print(q))printmazepath(q,a);sign=1;</p><p><b>  }</b></p><p>  else for(i=1;i<=4;i++)</p><p>  mazepath(q,i);</p><p&g

86、t;<b>  }</b></p><p><b>  break;</b></p><p><b>  case 3:</b></p><p>  if(y-1>=1&&!found(x,y-1,p)&&!a.Maze[x][y-1])</p>&

87、lt;p><b>  {</b></p><p>  q=(Point*)malloc(sizeof(Point));</p><p>  q->vex_x=x;q->vex_y=y-1;q->next=p;</p><p>  p->direction=j;</p><p>  if(q-

88、>vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b>  {</b></p><p>  if(print(q))printmazepath(q,a);sign=1;</p><p><b>  }</b></p><p> 

89、 else for(i=1;i<=4;i++)</p><p>  mazepath(q,i);</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 4:</b></p><p

90、>  if(x-1>=1&&!found(x-1,y,p)&&!a.Maze[x-1][y])</p><p><b>  {</b></p><p>  q=(Point*)malloc(sizeof(Point));</p><p>  q->vex_x=x-1;q->vex_y=y;

91、q->next=p;</p><p>  p->direction=j;</p><p>  if(q->vex_x==a.maze_x&&q->vex_y==a.maze_y)</p><p><b>  {</b></p><p>  if(print(q))printmaze

92、path(q,a);sign=1;</p><p><b>  }</b></p><p>  else for(i=1;i<=4;i++)</p><p>  mazepath(q,i);</p><p><b>  }</b></p><p><b>  

93、break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p><b>  int i;<

94、;/b></p><p><b>  Point *p;</b></p><p>  a=creat();</p><p>  p=(Point*)malloc(sizeof(Point));</p><p>  p->vex_x=1;p->vex_y=1;p->next=NULL;</p&

95、gt;<p>  printf("\n di gui qiu de mi gong mei you ke neng de lu xian\n");</p><p>  for(i=1;i<=4;i++)</p><p>  mazepath(p,i);</p><p>  if(sign==0)</p><

96、;p>  printf("bu neng dao da chu kou\n");</p><p><b>  getch();</b></p><p><b>  }</b></p><p><b>  6.運(yùn)行與測試</b></p><p><

97、b>  非遞歸:</b></p><p>  首先輸入行數(shù)和列數(shù),然后按行輸入迷宮信息我輸入的是:</p><p><b>  行數(shù)6,列數(shù)8:;</b></p><p>  迷宮信息為:0 1 1 1 0 1 1 1;0 0 0 0 1 1 1 1;0 1 0 0 0 0 0 1;0 1 1 1 0 0 1 1;</p

98、><p>  1 0 0 1 1 0 0 0;0 1 1 0 0 1 1 0; </p><p><b>  運(yùn)行結(jié)果為:</b></p><p>  、 </p><p><b>  遞歸:</b></p><p>  首先輸入行數(shù)和列數(shù),然后按行輸入迷宮

99、信息我輸入的是:</p><p>  輸入6行8列的迷宮信息:</p><p>  0 1 1 1 0 1 1 1;0 0 0 0 1 1 1 1;0 1 0 0 0 0 0 1;0 1 1 1 0 0 1 1;</p><p>  1 0 0 1 1 0 0 0;0 1 1 0 0 1 1 0; </p><p><b>  運(yùn)

溫馨提示

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

最新文檔

評論

0/150

提交評論