堆棧迷宮求解_第1頁(yè)
堆棧迷宮求解_第2頁(yè)
堆棧迷宮求解_第3頁(yè)
堆棧迷宮求解_第4頁(yè)
堆棧迷宮求解_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

堆棧迷宮求解#include<iostream>#include<malloc.h>#include<cstdlib>//隨機(jī)數(shù)srand頭文件#include<time.h>//time頭文件defineOK1defineOVERFLOW0defineTRUE1defineFALSE0defineSTACK_INIT_SIZE100//存儲(chǔ)空間初始分配量defineSTACKINCREMENT10//存儲(chǔ)空間分配增量defineN5usingnamespacestd;typedefstruct{intx,y;}PosType;//定義通道塊位置坐標(biāo)typedefstruct{intord;//通道塊在路徑上的“序號(hào)”P(pán)osTypeseat;//通道塊在迷宮中的坐標(biāo)位置intdi; //從此通道塊走向下一通道塊的方向}SElemType; //棧的元素類(lèi)型定義if(!s.base)exit(OVERFLOW);if(!s.base)exit(OVERFLOW);存儲(chǔ)分配失敗//typedefstruct{SElemType*base;SElemType*top;intstacksize;//當(dāng)前已分配的存儲(chǔ)空間}SqStack;//棧定義intarry[N][N];intRandom(){inti,j,k;srand(unsigned(time(0)));arry[1][0]=arry[N-2][N-1]=0;//將入口、出口設(shè)置為“ 0”即可通過(guò)for(j=0;j<N;j++)arry[0][j]=arry[N-1][j]=1; //設(shè)置迷宮外圍“不可走” ,保證只有一個(gè)出口和入口for(i=2;i<N-1;i++)arry[i][0]=arry[i-1][N-1]=1; //設(shè)置迷宮外圍“不可走” ,保證只有一個(gè)出口和入口for(i=1;i<N-1;i++)for(j=1;j<N-1;j++){k=rand()%3;//隨機(jī)生成 0、1、2三個(gè)數(shù)if(k)arry[i][j]=0;else{if((i==1&&j==1)||(i==N-2&&j==N-2))//距入口或出口一步的路是必經(jīng)之路,故設(shè)該通道塊為“ 0”加大迷宮能通行的概率arry[i][j]=0;elsearry[i][j]=1;}}returnOK;}intInitStack(SqStack&s){//構(gòu)造一個(gè)空棧 Ss.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!s.base)exit(OVERFLOW);存儲(chǔ)分配失敗//s.top=s.base;s.stacksize=STACK_INIT_SIZE;returnOK;}intPush(SqStack&s,SElemType&e){插入// e為新的棧頂元素if(s.top-s.base>=STACK_INIT_SIZE)棧滿(mǎn){//,追加存儲(chǔ)空間s.base=(SElemType*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;returnOK;}intPop(SqStack&s,SElemType&e){若棧不空,// 刪除 S的棧頂元素if(s.base==s.top)returnFALSE;e=*--s.top;returnOK;}PosTypeNextPos(PosType&e,intdir){//探索下一步PosTypeE;switch(dir){case1:E.x=e.x;//向下E.y=e.y+1;break;case2:E.x=e.x+1;//向右E.y=e.y;break;case3:E.x=e.x;//向上returnOVERFLOW;returnOVERFLOW;//其它returnOVERFLOW;returnOVERFLOW;//其它E.y=e.y-1;break;case4:E.x=e.x-1;//向左E.y=e.y;break;}returnE;}intStackEmpty(SqStacks){/判斷棧是否為空/if(s.top==s.base)returnOK;returnOVERFLOW;}intMarkPrint(PosTypee){//留下不能通過(guò)的足跡arry[e.x][e.y]=3;returnOK;}intPass(PosTypee){/當(dāng)前塊可否通過(guò)/if(arry[e.x][e.y]==0)//0時(shí)可以通過(guò)returnOK;//如果當(dāng)前位置是可以通過(guò),返回 1if(Pass(curpos))if(Pass(curpos))if(Pass(curpos))if(Pass(curpos))情況返回 0intFootPrint(PosTypee){//留下通過(guò)的足跡arry[e.x][e.y]=7;returnOK;}//迷宮函數(shù)//若迷宮maze中從入口 start到出口end的通道,則求得一條存放在棧中(從棧底到棧頂) ,并返回 TRUE;否則返回 FALSEintMazePath(intarry,PosTypestart,PosTypeend,SqStack&s){PosTypecurpos;InitStack(s);SElemTypee;intcurstep;curpos=start;//設(shè)定"當(dāng)前位置"為"入口位置"curstep=1;//探索第一步do{}}{//當(dāng)前位置可通過(guò),即是未曾走到過(guò)的通道塊FootPrint(curpos);//留下足跡e.di=1;e.ord=curstep;e.seat=curpos;Push(s,e);//加入路徑if(curpos.x==end.x&&curpos.y==end.y){cout<<"Goodjob!能到達(dá)終點(diǎn) !"<<endl;returnTRUE;}curpos=NextPos(curpos,1);//下一位置是當(dāng)前位置的東鄰curstep++;//探索下一步}else{//當(dāng)前位置不能通過(guò)if(!StackEmpty(s)){Pop(s,e);while(e.di==4&&!StackEmpty(s)){MarkPrint(e.seat);Pop(s,e);}if(e.di<4){e.di++;Push(s,e);//留下不能通過(guò)的標(biāo)記,并退回一步curpos=NextPos(e.seat,e.di);//當(dāng)前位置設(shè)為新方向的相鄰塊}}}}while(!StackEmpty(s));cout<<"Sorry!不能到達(dá)終點(diǎn) !"<<endl;returnFALSE;}voidPrintMaze(){//打印迷宮inti,j;for(i=0;i<N;i++){for(j=0;j<N;j++){if(arry[i][j]==0)cout<<"";elseif(arry[i][j]==1)cout<<"■";//迷宮的“墻”elseif(arry[i][j]==3)cout<<"

"; //不通的路elseif(arry[i][j]==7)cout<<"○"; //通過(guò)的路徑}cout<<endl;}voidmain(){SqStackS;PosTypestart,end;start.x=1;start.y=0;//起點(diǎn)坐標(biāo)end.x=N-2;end.y=N-1;//終點(diǎn)坐標(biāo)cout<<"\n==================迷宮游戲==================";cout<<"\n說(shuō)明 :■不能走的區(qū)域 \t

走不通的區(qū)域 ";cout<<"\n“空格”代表未到過(guò)的區(qū)域";cout<<"\n○代表能通過(guò)的路徑,指向終點(diǎn)";cout<<"\n 命令菜單 ";cout<<"\n1.系統(tǒng)隨機(jī)生成一個(gè)迷宮 ";cout<<"\n2.輸入一個(gè)迷宮 ";cout<<"\n3.打印走出迷宮的路徑 ";cout<<"\n4.退出游戲 ";cout<<"\n============================================";cout<<"\n請(qǐng)輸入您想執(zhí)行的操作命令: "<<endl;intn;while(cin>>n&&n){if(n==1)cout<<"系統(tǒng)將默認(rèn)生成一個(gè)大小為"<<N<<"x"<<N<<"的迷宮:"<<endl;Random();MazePath(arry[N][N],start,end,S);PrintMaze();system("pause");cout<<"請(qǐng)輸入您接下來(lái)要執(zhí)行的操作命令:"<<endl;}elseif(n==2){cout<<"提示:此迷宮的大小須為"<<N<<"x"<<N<<":"<<endl;cout<<"請(qǐng)輸入迷宮: "<<endl;for(inti=0;i<N;i++)for(intj=0;j<N;j++)}}}}cin>>arry[i][j];PosTypes1,e1;cout<<"請(qǐng)輸入入口坐標(biāo): "<<endl;cin>>s1.x>>s1.y;cout<<"請(qǐng)輸入出口坐標(biāo): "<<endl;cin>>e1.x>>e1.y;MazePath(arry[N][N],s1,e1,S);PrintMaze();system("pause");cout<<"請(qǐng)輸入您接下來(lái)要執(zhí)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論