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

下載本文檔

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

文檔簡介

1、<p>  題 目: 迷宮問題 </p><p><b>  課程設(shè)計(jì)目的</b></p><p>  1, 深入了解棧的特征及數(shù)據(jù)結(jié)構(gòu)。</p><p>  2, 了解迷宮問題的提出背景以及試探法的求解思路。</p><p>

2、  3, 設(shè)計(jì)實(shí)現(xiàn)一個(gè)完整的迷宮求解程序。</p><p><b>  課程設(shè)計(jì)內(nèi)容</b></p><p>  迷宮是實(shí)驗(yàn)心理學(xué)中一個(gè)古典問題。用計(jì)算機(jī)解迷宮路徑的程序,就是仿照人走迷宮。計(jì)算機(jī)解迷宮時(shí),通常用的是"窮舉求解"的方法,即從入口出發(fā),順某一方向向前探索,若能走通,則繼續(xù)往前走;否則沿原路退回,換一個(gè)方向再繼續(xù)探索,直至所有可能的通路

3、都探索到為止。</p><p><b>  三、需求分析</b></p><p>  電腦自動(dòng)存儲迷宮,先將m*n迷宮先輸入在文件中,通過輸入文件名(*.txt),將該迷宮在屏幕上顯示出來,選擇通路。</p><p>  由用戶自己手動(dòng)創(chuàng)建迷宮,將創(chuàng)建好的m*n迷宮保存在文件(*.txt)中,選擇通路。</p><p>

4、  用“回溯法”來尋找通路,借用一個(gè)move[4]數(shù)組來存儲四個(gè)方向,數(shù)組的i,j兩個(gè)域分別表示行列位移的增量,在通過棧的相關(guān)操作來求解通路。</p><p>  最終的解要求在屏幕上顯示并存入文件(*.txt)中。</p><p><b>  四、概要設(shè)計(jì)</b></p><p><b>  1.系統(tǒng)結(jié)構(gòu)圖</b><

5、;/p><p><b>  2.功能模塊說明</b></p><p>  1,定義相關(guān)的結(jié)構(gòu)體。</p><p>  2,關(guān)于棧的操作,入棧,出棧,判空棧,銷毀棧。</p><p>  3,先在文本文件中創(chuàng)建好一個(gè)迷宮,然后顯示在屏幕上,尋找通路并保存。</p><p>  4,用戶自己手動(dòng)創(chuàng)建好一個(gè)

6、迷宮,并保存在文件中,然后尋找通路并保存。</p><p>  5,利用菜單選擇自己創(chuàng)建迷宮的方式。</p><p>  五、詳細(xì)設(shè)計(jì)及運(yùn)行結(jié)果</p><p><b>  1,主要的流程圖</b></p><p>  2,重要的程序,Seekpath的主要算法</p><p>  //尋找迷宮路

7、徑并保存</p><p>  void Seekpath(char maze[Max][Max])</p><p><b>  {</b></p><p>  int i, j, d, x, y, m, n;</p><p>  Seqstack *S;</p><p><b>  F

8、ILE *fp;</b></p><p>  Item move[4]; </p><p>  Elemtype t;</p><p>  fp=fopen("路徑.txt","wt");</p><p>  S = (struct stack *)malloc(sizeof

9、(struct stack));</p><p>  InitStack(S);</p><p>  move[0].i = 0; move[0].j = 1; //move[4]數(shù)組的初始化</p><p>  move[1].i = 1; move[1].j = 0;</p><p>  move[2].i = 0; mov

10、e[2].j = -1;</p><p>  move[3].i = -1;move[3].j = 0; </p><p><b>  d = 0;</b></p><p>  printf("請輸入您想出的出口.\n");</p><p>  scanf("%d %d",&am

11、p;m,&n);</p><p>  printf("請輸入您想進(jìn)的入口. \n");</p><p>  scanf("%d",&t.i);</p><p><b>  t.j = 1;</b></p><p>  t.d = -1;

12、 //初始方向?yàn)?1</p><p>  if(S==NULL)</p><p><b>  {</b></p><p>  printf("error!");</p><p><b>  return;</b></p><p>&l

13、t;b>  }</b></p><p>  PushStack(S, t); //棧里的第一個(gè)元素就是入口點(diǎn)</p><p>  while(!EmptyStack(S))</p><p><b>  {</b></p><p>  PopStack(S, &

14、;t); //第一個(gè)元素出棧</p><p><b>  i = t.i;</b></p><p><b>  j = t.j;</b></p><p>  d = t.d +1; //下一個(gè)方向</p><p>  while(

15、d<4) //開始試探東南西北四個(gè)方向</p><p><b>  {</b></p><p>  x = i+move[d].i;</p><p>  y = j+move[d].j; //試探后的新坐標(biāo)</p><p>  if(maze[x][y

16、] == '0')</p><p><b>  {</b></p><p><b>  t.i = i;</b></p><p><b>  t.j = j;</b></p><p><b>  t.d = d;</b></p>

17、<p>  PushStack(S, t); //可以走的坐標(biāo)入棧</p><p><b>  i=x; j=y;</b></p><p>  maze[i][j] = -1; //已走過的路置為-1</p><p>  if(m==i && n==j) //判斷是否到了

18、出口</p><p><b>  {</b></p><p>  printf("通路為:\n"); //將走通的路徑打印出來</p><p>  printf("(%2d,%2d) <==",m, n);</p><p>  fprintf(fp,"

19、;%2d,%2d",m,n); //將m,n的值按%2d和%2d的格式輸出到fp指向的文件上</p><p>  while(!EmptyStack(S) && S->top!=0) </p><p><b>  {</b></p><p>  PopStack(S, &t);</p&

20、gt;<p>  printf("(%2d,%2d) <== ",t.i,t.j);</p><p>  fputs("<==",fp);</p><p>  fprintf(fp,"%2d,%2d",t.i,t.j);</p><p><b>  }</b>

21、</p><p>  if(S->top==0)</p><p>  PopStack(S, &t);</p><p>  printf("(%2d,%2d) ",t.i,t.j);</p><p>  printf("\n路徑已保存!\n");</p><p>

22、  fputs("<==",fp);</p><p>  fprintf(fp,"%2d,%2d",t.i,t.j);</p><p>  DestoryStack(&S); //所有的元素出棧之后銷毀棧</p><p><b>  return;</b></p><

23、;p><b>  }</b></p><p><b>  else</b></p><p><b>  d=0;</b></p><p><b>  }</b></p><p><b>  else</b></p>

24、<p><b>  d++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  DestoryStack(&S);</p><p>  printf("該迷宮不能走通!\n");&

25、lt;/p><p>  fclose(fp);</p><p><b>  return ;</b></p><p><b>  }</b></p><p><b>  3,運(yùn)行結(jié)果 </b></p><p>  (1),文本文件中提前存儲好迷宮,然后選擇通

26、路。</p><p><b>  文件可以打開的情況</b></p><p><b>  文件不能打開的情況</b></p><p> ?。?),用戶手動(dòng)創(chuàng)建迷宮</p><p><b>  有通路的情況</b></p><p><b>  沒

27、有通路的情況</b></p><p>  六、調(diào)試情況,設(shè)計(jì)技巧及體會</p><p><b>  1,調(diào)試情況</b></p><p>  在調(diào)試的時(shí)候,程序出現(xiàn)了好多問題,有邏輯上的錯(cuò)誤,還有語法上的錯(cuò)誤,特別是文件的讀寫方式那經(jīng)常搞錯(cuò),還有一個(gè)關(guān)于緩沖區(qū)的問題,經(jīng)常忘記用</p><p>  Flush

28、all(),導(dǎo)致調(diào)試時(shí)出現(xiàn)問題。不過最后經(jīng)過仔細(xì)的分析解決了這個(gè)問題,最終的程序也沒有太大的問題。</p><p><b>  2,程序的優(yōu)缺點(diǎn)</b></p><p>  我認(rèn)為本次程序中較好的一點(diǎn)是,我可以用兩種方法來創(chuàng)建迷宮并顯示在屏幕上,然后查找通路并保存。不足之處是沒有找到最短路徑,界面也不夠美觀好看,最終展示出的迷宮路徑不太直觀,如果用動(dòng)態(tài)的會更好。<

29、;/p><p><b>  3,心得體會</b></p><p>  通過一周的學(xué)習(xí)與上機(jī)編程,大大提高了我的編程能力,讓我把棧的相關(guān)知識和數(shù)據(jù)結(jié)構(gòu)有了更好的理解。同時(shí)也使我面對一個(gè)程序時(shí),能更好地深刻的去理解它,分析它,找出最有效的解決方法。在面對不懂的問題時(shí),請教老師或同學(xué),幫助我解決問題,這樣也有助于我能力的提高。但在以后還需要多多上機(jī)編程,真正學(xué)通數(shù)據(jù)結(jié)構(gòu)這門課,

30、為之后的相關(guān)科目打好基礎(chǔ)??傊?,此次實(shí)習(xí),我收獲頗多,以后會更加努力的。</p><p><b>  七、參考文獻(xiàn)</b></p><p>  數(shù)據(jù)結(jié)構(gòu)-C語言描述 C語言程序設(shè)計(jì)</p><p><b>  八、附錄:源代碼</b></p><p>  #include<stdio.h

31、></p><p>  #include<malloc.h></p><p>  #include<string.h></p><p>  #include<stdlib.h></p><p>  #define stacksize 20</p><p>  #define M

32、ax 20 //maze[][]數(shù)組行列的最大范圍</p><p>  typedef struct //move[4]的兩個(gè)域,0,1,2,3分別表示東西南北</p><p>  { </p><p>  int i; //i表示行位移</p>

33、<p>  int j; //j表示列位移</p><p><b>  }Item;</b></p><p>  typedef struct //棧中每一個(gè)節(jié)點(diǎn)的三個(gè)元素</p><p>  { </p><p>  int i;

34、 //當(dāng)前的行坐標(biāo)</p><p>  int j; //當(dāng)前的列坐標(biāo)</p><p>  int d; //下一步要到達(dá)的方向</p><p>  }Elemtype;</p><p>  //有關(guān)順序棧的相關(guān)操作</p><p>  typedef struc

35、t stack</p><p><b>  {</b></p><p>  Elemtype data[stacksize];</p><p><b>  int top;</b></p><p>  }Seqstack;</p><p><b>  //初始化棧&

36、lt;/b></p><p>  void InitStack(Seqstack *S)</p><p><b>  {</b></p><p>  S->top = -1;</p><p><b>  }</b></p><p><b>  //入棧&

37、lt;/b></p><p>  int PushStack(Seqstack *S,Elemtype x)</p><p><b>  {</b></p><p>  if(S->top == stacksize-1 )</p><p><b>  return 0;</b></

38、p><p><b>  S->top++;</b></p><p>  S->data[S->top]=x;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>

39、  //出棧</b></p><p>  int PopStack(Seqstack *S,Elemtype *x)</p><p><b>  {</b></p><p>  if(S->top == -1)</p><p><b>  return 0;</b></p&g

40、t;<p><b>  else</b></p><p><b>  {</b></p><p>  *x = S->data[S->top];</p><p><b>  S->top--;</b></p><p><b>  ret

41、urn 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //判空棧</b></p><p>  int EmptyStack(Seqstack *S)</p><p>

42、<b>  {</b></p><p>  if(S->top == -1)</p><p><b>  return 1;</b></p><p><b>  else </b></p><p><b>  return 0;</b></p&

43、gt;<p><b>  }</b></p><p><b>  //銷毀棧</b></p><p>  void DestoryStack(Seqstack **S)</p><p><b>  {</b></p><p><b>  if(*S)&l

44、t;/b></p><p><b>  free(*S);</b></p><p>  *S = NULL;</p><p><b>  return; </b></p><p><b>  }</b></p><p>  //電腦自動(dòng)創(chuàng)建迷宮&l

45、t;/p><p>  int dcreatmaze(char maze[][Max],int M,int N) //M N為電腦自動(dòng)創(chuàng)建時(shí)的行和列</p><p><b>  {</b></p><p>  int i, j; //創(chuàng)建迷宮時(shí)的下標(biāo),i表示行,j表示列</p>

46、;<p>  FILE *fp; </p><p><b>  char n;</b></p><p>  char filename[20];</p><p>  printf("請輸入要打開文件的完整路徑及文件名: ");</p>

47、<p>  flushall();</p><p>  gets(filename);</p><p>  fp = fopen(filename, "r"); //只讀,為輸入打開一個(gè)文本文件</p><p>  if( fp == NULL)</p><p><b>  

48、{</b></p><p>  printf("文件打開失敗,文件名可能不存在 !\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  flushall();</p><p&

49、gt;  while(!feof(fp)) //用來測試fp所指向的文件當(dāng)前狀態(tài)是否"文件結(jié)束"</p><p><b>  {</b></p><p>  for(i=0; i<M; i++)</p><p><b>  {</b></p><p&

50、gt;  for(j=0;j<N;j++)</p><p><b>  {</b></p><p>  fscanf(fp,"%c",&maze[i][j]); //將磁盤文件中的數(shù)據(jù)送給maze[][]數(shù)組</p><p><b>  }</b></p><p&g

51、t;  fscanf(fp,"%c",&n); //將磁盤文件中的換行給n</p><p><b>  }</b></p><p><b>  }</b></p><p>  fclose(fp);</p><p>  printf("\n

52、親,您現(xiàn)在可以走迷宮了~~~\n");</p><p>  for(i=0; i<=M; i++) //輸出迷宮</p><p><b>  {</b></p><p>  for(j=0; j<=N; j++)</p><p><b>  {&

53、lt;/b></p><p>  if (maze[i][j] == '1')</p><p>  printf("◆");</p><p>  else if(maze[i][j] == '0')</p><p>  printf("◇");</p>

54、<p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  return 1;</b>&l

55、t;/p><p><b>  }</b></p><p>  //尋找迷宮路徑并保存</p><p>  void Seekpath(char maze[Max][Max])</p><p><b>  {</b></p><p>  int i, j, d, x, y, m,

56、 n;</p><p>  Seqstack *S;</p><p><b>  FILE *fp;</b></p><p>  Item move[4]; </p><p>  Elemtype t;</p><p>  fp=fopen("路徑.txt",&

57、quot;wt");</p><p>  S = (struct stack *)malloc(sizeof(struct stack));</p><p>  InitStack(S);</p><p>  move[0].i = 0; move[0].j = 1; //move[4]數(shù)組的初始化</p><p> 

58、 move[1].i = 1; move[1].j = 0;</p><p>  move[2].i = 0; move[2].j = -1;</p><p>  move[3].i = -1;move[3].j = 0; </p><p><b>  d = 0;</b></p><p>  printf("

59、;請輸入您想出的出口.\n");</p><p>  scanf("%d %d",&m,&n);</p><p>  printf("請輸入您想進(jìn)的入口. \n");</p><p>  scanf("%d",&t.i);</p><p><b

60、>  t.j = 1;</b></p><p>  t.d = -1; //初始方向?yàn)?1</p><p>  if(S==NULL)</p><p><b>  {</b></p><p>  printf("error!");&

61、lt;/p><p><b>  return;</b></p><p><b>  }</b></p><p>  PushStack(S, t); //棧里的第一個(gè)元素就是入口點(diǎn)</p><p>  while(!EmptyStack(S))</p>

62、<p><b>  {</b></p><p>  PopStack(S, &t); //第一個(gè)元素出棧</p><p><b>  i = t.i;</b></p><p><b>  j = t.j;</b></p><p>

63、;  d = t.d +1; //下一個(gè)方向</p><p>  while(d<4) //開始試探東南西北四個(gè)方向</p><p><b>  {</b></p><p>  x = i+move[d].i;</p><p>  y

64、 = j+move[d].j; //試探后的新坐標(biāo)</p><p>  if(maze[x][y] == '0')</p><p><b>  {</b></p><p><b>  t.i = i;</b></p><p><b>  t.j = j

65、;</b></p><p><b>  t.d = d;</b></p><p>  PushStack(S, t); //可以走的坐標(biāo)入棧</p><p><b>  i=x; j=y;</b></p><p>  maze[i][j] = -1; //已走

66、過的路置為-1</p><p>  if(m==i && n==j) //判斷是否到了出口</p><p><b>  {</b></p><p>  printf("通路為:\n"); //將走通的路徑打印出來</p><p>  printf(&qu

67、ot;(%2d,%2d) <==",m, n);</p><p>  fprintf(fp,"%2d,%2d",m,n); //將m,n的值按%2d和%2d的格式輸出到fp指向的文件上</p><p>  while(!EmptyStack(S) && S->top!=0) </p><p>&

68、lt;b>  {</b></p><p>  PopStack(S, &t);</p><p>  printf("(%2d,%2d) <== ",t.i,t.j);</p><p>  fputs("<==",fp);</p><p>  fprintf(fp,&

69、quot;%2d,%2d",t.i,t.j);</p><p><b>  }</b></p><p>  if(S->top==0)</p><p>  PopStack(S, &t);</p><p>  printf("(%2d,%2d) ",t.i,t.j);<

70、/p><p>  printf("\n路徑已保存!\n");</p><p>  fputs("<==",fp);</p><p>  fprintf(fp,"%2d,%2d",t.i,t.j);</p><p>  DestoryStack(&S); //所有的元素

71、出棧之后銷毀棧</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  d=0;</b></p><p><b>

72、;  }</b></p><p><b>  else</b></p><p><b>  d++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  Desto

73、ryStack(&S);</p><p>  printf("該迷宮不能走通!\n");</p><p>  fclose(fp);</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  

74、void zcreatmaze(char maze[Max][Max]) </p><p><b>  {</b></p><p>  int i,j,m,n;</p><p><b>  FILE *fp;</b></p><p><b>  char ch;</b><

75、/p><p>  fp=fopen("migong.txt","wt"); //為輸出打開一個(gè)文本文件,只寫</p><p>  printf("請輸入迷宮的行數(shù)和列數(shù)(包括外圍的墻壁):");</p><p>  scanf("%d%d",&m,&n);</p&g

76、t;<p>  flushall();</p><p>  printf("\n請輸入迷宮\n");</p><p>  for(i=0;i<m;i++)</p><p>  {//創(chuàng)建迷宮</p><p>  for(j=0;j<n;j++)</p><p>

77、  scanf("%c",&maze[i][j]);</p><p>  flushall();</p><p><b>  }</b></p><p>  printf("\n");</p><p>  printf("您創(chuàng)建的迷宮為:\n\n");&

78、lt;/p><p>  for(i=0; i<m; i++) //輸出迷宮 </p><p><b>  {</b></p><p>  for(j=0; j<n; j++)</p><p><b>  {</b></p><p>  if(maze[i][j]

79、 == '1')</p><p>  printf("◆");</p><p>  else if(maze[i][j] == '0')</p><p>  printf("◇");</p><p>  fprintf(fp,"%c ",maze[i

80、][j]);</p><p><b>  } </b></p><p>  fprintf(fp,"\n");</p><p>  printf("\n");</p><p><b>  }</b></p><p>  fclose(f

81、p);</p><p>  printf("\n");</p><p>  printf("該迷宮已保存!\n");</p><p>  Seekpath(maze);</p><p>  printf("\n");</p><p><b>  }&

82、lt;/b></p><p>  void menu()</p><p><b>  {</b></p><p>  printf("\t ※※※※※※※※※※※※※※※\n\n");</p><p>  printf("\t ☆1

83、. 電腦自動(dòng)生成迷宮 \n");</p><p>  printf("\t ☆2. 用戶手動(dòng)創(chuàng)建迷宮 \n");</p><p>  printf("\t ☆0. 退出系統(tǒng) \n\n");</p><p>  print

84、f("\t ※※※※※※※※※※※※※※※ \n");</p><p>  printf("\t 輸入數(shù)字編號(0-2):");</p><p><b>  }</b></p><p>  void main()</p><p><

85、b>  {</b></p><p>  char maze[Max][Max];</p><p>  int choice;</p><p>  while(choice)</p><p><b>  {</b></p><p>  flushall();</p>

86、<p>  system("cls");</p><p><b>  menu();</b></p><p>  scanf("%d",&choice);</p><p>  switch(choice)</p><p><b>  { </b&

87、gt;</p><p><b>  case 1: </b></p><p>  system("cls");</p><p>  dcreatmaze(maze,8,8);</p><p>  Seekpath(maze);</p><p>  printf("\n

88、");</p><p>  system("pause");</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  system("cls");</p><p&g

89、t;  zcreatmaze(maze);</p><p>  system("pause");</p><p><b>  break;</b></p><p><b>  case 0:</b></p><p><b>  break;</b></

溫馨提示

  • 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

提交評論