迷宮的尋找路徑和最短路徑的動畫演示

2021-06-05 10:11:43 字數 4168 閱讀 5217

這是自己編寫的第乙個dos動畫程式,所以自己感觸很深,今天作為乙個成就,寫於自己的部落格中,希望和大家分享~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

定義標頭檔案t11.h中

#include"stdio.h"

#include"string.h"

#include"ctype.h"

#include"malloc.h"

#include"stdlib.h"  //atoi(),exit();

#include"io.h"      //eof()

#include"math.h"

#define  true  1

#define  false  0

#define  ok   1

#define  error 0

typedef int status;

typedef int boolean;

定義儲存資料結構包含於m1.h標頭檔案

#define init_stack_size 40

#define stack_add 10

#define init_queue 100

#define init_add 40

typedef struct

migong,*mi;

typedef struct

ji,*hui;

typedef struct

cun;

typedef struct     //  把位子放入棧中 線性表操作

sqstack;

typedef struct sq

sq;typedef struct  //定義佇列資料結構

dui;

定義實現函式包含於migong.cpp檔案中

void initdui(dui &l)                   //  初始化佇列  

l.size=init_queue;

printf("初始化成功!! \n");

}void enqueue(dui &l,int i,int j,int i1,int j1)            //   此佇列針對迷宮先全部進完後再出,而設的順序佇列

}l.rear->i=i;

l.rear->j=j;

l.rear->i1=i1;

(l.rear++)->j1=j1;

}void initstack(sqstack &l)            //  初始化棧操作

l.top=l.bottom;

l.stacksize=init_stack_size;

}status push(sqstack &l,int q,int p)          // 壓入位置 q表示行,p表示列

l.top=l.bottom+l.stacksize;

l.stacksize+=stack_add;

}l.top->i=q;

(l.top++)->j=p;

return ok;

}status pop(sqstack &l,int &k,int &l)    //   彈出 將棧頂的元素帶回

status emptystack(sqstack l)         //  判斷棧為空

void init(ji &l)                               //   初始化資料

printf("初始化成功!\n");

}void print(ji l)

else

printf("  ");

if((i+1)%l.size == 0)

printf("\n");

}printf("\n");

}void shuru(ji &l,int &e)

// print(l);

printf("設定牆:\n");

printf("輸入迷宮的行和列:");

int k,j;

char ch='y';

while('y' == ch || 'y' == ch)

// print(l);

getchar();

}void ****uan(ji &l,int z,int x,int &m,int &n)   //  判斷方向

}void chuli(ji &l,dui &t,sqstack &r)

(l.elem+l.size*i+j)->direct++;

if(m == l.size-2 && n == l.size-2)           //   找到最後乙個跳出迴圈

break;

}if(m == l.size-2 && n == l.size-2)

break;

}t=q;           //   將q迴圈的值放入t中,最為下次迴圈的終止條件

if(r == w)

if(m == l.size-2 && n == l.size-2)

break;

}m=(--t.rear)->i;                    //  佇列中的最後乙個入隊元素中是最後乙個位置

n=t.rear->j;

push(r,m,n);

i=t.rear->i1;

j=t.rear->j1;

(l.elem+l.size*m+n)->road=2;

// printf("進入第二個迴圈!!");

// getchar();

while(t.rear != t.front)                 // 往上一直尋找

}//  print(l);                 //   列印路徑

}void chuli1(ji &l,sqstack &t)

else if((l.elem+l.size*i+j)->direct >4)   //  4個方向都沒有路了

(l.elem+l.size*i+j)->road=-1;     //  將走過的路,不通的留下記號,標記為-1

(l.elem+l.size*i+j)->foot=1;      //  留下足跡

pop(t,i,j);           // 不通的路徑出棧}}

if(m == l.size-2 && n == l.size-2)     // 將最後乙個位置為留下2

// print(l);

}void  gotoconsolexy(handle  hconsole,int  x,int  y)  // 定位游標位置

;  setconsolecursorposition(hconsole,coordscreen); 

return; 

}  void gotoxy(int  x,int  y)                        // 定位游標位置

void move(int m,int n,int p,int q,int e)

void huatu(sqstack &l,int &e,int &i)   //  畫圖,產生動畫

}定義主函式中呼叫包含於main_5中

#include"t11.h"

#include "windows.h"    //  包含暫停函式

#include"m1.h"

#include"migong.cpp"

void main()

print(s);          // 列印出迷宮圖案

huatu(f,e,k);    //  畫圖函式,找出按規定演算法的路徑

printf("\n\n恭喜你一條路徑出來啦!! 歷經%d步\n",k);

int m=s.size*s.size;   //  儲存長度值

for(int i=0;iroad != 0)

(s.elem+i)->road=1;

(s.elem+i)->direct=1;

(s.elem+i)->foot=0;

}chuli(s,t,r);          //  做出處理

print(s);   //  列印路徑

e=e+s.size+1;  // 算出此刻游標位置

huatu(r,e,k);  // 找出最短路徑

printf("\n\n恭喜你最短路徑出來啦!! 歷經%d步\n",k);

}這是全部自己思想編寫出來的,我很享受思考的過程,雖然會有困難,但這是乙個很有意思的過程,不僅需要嚴謹的邏輯思維還需要充分的耐心。

尋找迷宮中的最短路徑

給定乙個n m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。最初,有乙個人位於左上角 1,1 處,已知該人每次可以向上 下 左 右任意乙個方向移動乙個位置。請問,該人從左上角移動至右下角 n,m 處,至少需要移動多少次。資料保證 1,1 處和 n,...

自動尋找走出迷宮的最短路徑

演算法心得 1.利用廣度優先遍歷 bfs 實現尋找最短路徑 2.利用樹的思想,將每走一步的終點與它的起點相連線,這樣就能在最後把整條最短路徑找出來 設定乙個結構體,儲存座標 struct note que size size 儲存座標和連線指標 struct tree ans size 2 size...

迷宮的最短路徑

雖然在網上找不到題目,但這題實在是太經典了,好多搜尋題目都是從它變形來的 從s走到g,不能走 測試資料 10 10 s g include include includeusing namespace std const int inf 100000000 define max n 105 defi...