迷宮問題的C-C--算法實(shí)現(xiàn)匯總_第1頁(yè)
迷宮問題的C-C--算法實(shí)現(xiàn)匯總_第2頁(yè)
迷宮問題的C-C--算法實(shí)現(xiàn)匯總_第3頁(yè)
迷宮問題的C-C--算法實(shí)現(xiàn)匯總_第4頁(yè)
迷宮問題的C-C--算法實(shí)現(xiàn)匯總_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、基于棧的C語(yǔ)言迷宮問題與實(shí)現(xiàn)一 問題描述多年以來,迷宮問題一直是令人感興趣的題目。實(shí)驗(yàn)心理學(xué)家訓(xùn)練老鼠在迷宮中尋找食物。許多神秘主義小說家也曾經(jīng)把英國(guó)鄉(xiāng)村花園迷宮作為謀殺現(xiàn)場(chǎng)。于是,老鼠過迷宮問題就此產(chǎn)生,這是一個(gè)很有趣的計(jì)算機(jī)問題,主要利用 “棧”是老鼠通過嘗試的辦法從入口穿過迷宮走到出口。迷宮只有兩個(gè)門,一個(gè)叫做入口,另一個(gè)叫做出口。把一只老鼠從一個(gè)無頂蓋的大盒子的入口處趕進(jìn)迷宮。迷宮中設(shè)置很多隔壁,對(duì)前進(jìn)方向形成了多處障礙,在迷宮的唯一出口處放置了一塊奶酪,吸引老鼠在迷宮中尋找通路以到達(dá)出口。求解迷宮問題,即找出從入口到出口的路徑。一個(gè)迷宮可用上圖所示方陣m,n表示,0表示能通過,1 表

2、示不能通過?,F(xiàn)假設(shè)耗子從左上角1,1進(jìn)入迷宮,編寫算法,尋求一條從右下角m,n 出去的路徑。下圖是一個(gè)迷宮的示意圖:二 算法基本思想迷宮求解問題是棧的一個(gè)典型應(yīng)用?;舅惴ㄋ枷胧牵涸谀硞€(gè)點(diǎn)上,按照一定的順序(在本程序中順序?yàn)樯?、右、下、左)?duì)周圍的墻、路進(jìn)行判斷(在本程序中分別用1、0)代替,若周圍某個(gè)位置為0,則移動(dòng)到該點(diǎn)上,再進(jìn)行下一次判斷;若周圍的位置都為1(即沒有通路),則一步步原路返回并判斷有無其他通路,然后再次進(jìn)行相同的判斷,直到走到終點(diǎn)為止,或者確認(rèn)沒有任何通路后終止程序。要實(shí)現(xiàn)上述算法,需要用到棧的思想。棧里面壓的是走過的路徑,若遇到死路,則將該位置(在棧的頂層)彈出,再進(jìn)行下

3、一次判斷;若遇到通路,則將該位置壓棧并進(jìn)行下一次判斷。如此反復(fù)循環(huán),直到程序結(jié)束。此時(shí),若迷宮有通路,則棧中存儲(chǔ)的是迷宮通路坐標(biāo)的倒序排列,再把所有坐標(biāo)順序打印后,即可得到正確的迷宮通路。三 程序具體部分的說明1. 迷宮的生成根據(jù)題目的要求,迷宮的大小是自定義輸入的。所以在程序中用malloc申請(qǐng)動(dòng)態(tài)二維數(shù)組。數(shù)組中的元素為隨機(jī)生成的0、1。數(shù)組周圍一圈的元素全部定義為1,以表示邊界。2. 棧的C語(yǔ)言實(shí)現(xiàn)為了實(shí)現(xiàn)棧的功能,即清空、壓棧、彈出、返回棧頂元素,在程序中編寫了相應(yīng)的函數(shù)。MakeNULL 清空棧Push 將橫、縱坐標(biāo)壓棧Topx 返回棧頂存儲(chǔ)的橫坐標(biāo)Topy 返回棧頂存儲(chǔ)的縱坐標(biāo)Po

4、p 彈出棧頂元素3. 具體的判斷算法當(dāng)位置坐標(biāo)(程序中為X Y)移到某一位置時(shí),將這個(gè)位置的值賦值為1并壓棧,以說明該點(diǎn)已經(jīng)走過。接著依次判斷該點(diǎn)的上、右、下、左是否為0,若有一方為0,則移動(dòng)到該位置上,進(jìn)行下次判斷;若為周圍位置全部是1,則將該點(diǎn)壓棧后不斷彈出,每次彈出時(shí)判斷棧頂元素(即走過的路)周圍有無其他通路。如果有的話,則選擇該方向繼續(xù)走下去;如果棧已經(jīng)為空仍然沒有找到出路,則迷宮沒有出口程序結(jié)束。當(dāng)X Y走到出口坐標(biāo)時(shí),程序判斷部分結(jié)束。棧里面存儲(chǔ)的是每個(gè)走過的點(diǎn)的坐標(biāo),將這些橫縱坐標(biāo)分別存儲(chǔ)在兩個(gè)數(shù)組中,最后將數(shù)組中的坐標(biāo)元素倒序輸出,即得到了完整的路徑。四 程序源代碼及注釋 /

5、Maze.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include "stdafx.h"#include<stdio.h>#include<string.h>#include<malloc.h>#include <stdlib.h> #include<time.h>typedef int Elementtype;struct nodeElementtype val1;Elementtype val2; node *next;/定義結(jié)構(gòu)體typedef node *MAZE;void MakeNull(MAZE &

6、amp;S);void Push(Elementtype x,Elementtype y, MAZE S);void Pop(MAZE S);Elementtype Topx(MAZE S);Elementtype Topy(MAZE S);/申明函數(shù)int _tmain(int argc, _TCHAR* argv)int *p,*q,*x1,*y1,i,j,k,n1,n2,m1,m2,l,w,max;int x,y;int a,b,c,d; printf("輸入迷宮長(zhǎng)度及寬度l和wn"); scanf("%d %d",&l,&w);g

7、etchar();n1=w+2;n2=l+2;/為迷宮加上邊界max=n1*n2; p=(int*)malloc(n1*sizeof(int); for(i=0;i<n1;i+) pi=(int *)malloc(n2*sizeof(int);/生成二維動(dòng)態(tài)數(shù)組 srand(time(NULL);x1=(int*)malloc(max*sizeof(int);/生成動(dòng)態(tài)數(shù)組用于存儲(chǔ)路徑y(tǒng)1=(int *)malloc(max*sizeof(int);/生成動(dòng)態(tài)數(shù)組用于存儲(chǔ)路徑 for(i=0;i<max;i+) x1i=0;for(i=0;i<max;i+) y1i=0;/先

8、將存儲(chǔ)路徑的數(shù)組元素全賦值為0 for(i=0;i<n1;i+) for(j=0;j<n2;j+) if(i=0 | j=0) pij=1; else if(i=n1-1 | j=n2-1) pij=1; else pij=rand()%2+0; /生成二維1 0隨機(jī)數(shù)組p11=0;pn1-2n2-2=0;/定義迷宮的入口及出口 printf("生成的迷宮如下(代表墻0代表路):n"); for(i=0;i<n1;i+) for(j=0;j<n2;j+) printf("%2d",pij); printf("n"

9、;);/打印迷宮 MAZE S; MakeNull(S);/清空棧 i=1;j=1;if(p12=1 && p21=1) printf("There is no way out");a getchar(); return 0;/判斷入口是否就是死路else do if(pi-1j=0) x=i; y=j; Push(x,y,S); pij=1; i=i-1; /判斷能否向上走 else if(pi-1j=1 && pij+1=0) x=i; y=j; Push(x,y,S); pij=1; j=j+1; /判斷能否向右走 else if(pi

10、-1j=1 && pij+1=1 && pi+1j=0) x=i; y=j; Push(x,y,S); k=Topx(S); pij=1; i=i+1; /判斷能否向下走 else if(pi-1j=1 && pij+1=1 && pi+1j=1 && pij-1=0) x=i; y=j; Push(x,y,S); pij=1; j=j-1; /判斷能否向左走 else if(pi-1j=1 && pij+1=1 && pi+1j=1 && pij-1=1)/判斷如果

11、為死路 pij=1; x=i; y=j; Push(x,y,S); for(;) Pop(S);/彈出棧頂元素 x=Topx(S); y=Topy(S);/返回棧頂元素橫縱坐標(biāo) if( px-1y=0) i=x-1; j=y; pij=1; x=i; y=j; Push(x,y,S); break; else if(px-1y=1 && pxy+1=0) i=x; j=y+1; pij=1; x=i; y=j; Push(x,y,S); break; else if(px-1y=1 && pxy+1=1 && px+1y=0) i=x+1; j=

12、y; pij=1; x=i; y=j; Push(x,y,S); break; else if(px-1y=1 && pxy+1=1 && px+1y=1 && pxy-1=0) i=x; j=y-1; pij=1; x=i; y=j; Push(x,y,S); break; /判斷彈出后棧頂元素周圍有無通路 else if(x=1 && y=1) printf("There is no way out"); getchar(); return 0; /如果棧頂元素為入口則迷宮無出路 while(i!=n1-2

13、 | j!=n2-2);/循環(huán)截止條件printf("Success!n The route is:n");for(i=0;i+) a=Topx(S); b=Topy(S); Pop(S); x1i=a; y1i=b;/將棧頂元素坐標(biāo)存儲(chǔ)在數(shù)組中 if(a=1 && b=1) getchar(); break; for(i=max-1;i>=0;) if(x1i!=0 && (x1i!=x1i-1 | y1i!=y1i-1) printf("<%d ,%d> ",x1i,y1i); i-; else if

14、(x1i!=0 && (x1i=x1i-1 && y1i=y1i-1) printf("<%d ,%d> ",x1i,y1i); i=i-2; else i-;/倒序打印數(shù)組得到順序出路坐標(biāo)printf("<%d ,%d>",n1-2,n2-2);/打印出口坐標(biāo) getchar();return 0;void MakeNull(MAZE &S) /清空棧的函數(shù)S = new node;S->next = NULL;void Push(Elementtype x,Elementtype

15、y, MAZE S)/壓棧函數(shù)MAZE stk;stk = new node;stk->val1 = x;stk->val2 = y;stk->next = S->next;S->next = stk;void Pop(MAZE S)/彈出函數(shù)MAZE stk;if(S->next)stk = S->next;S->next = stk->next;delete stk;Elementtype Topx(MAZE S)/返回橫坐標(biāo)函數(shù)if(S->next)return(S->next->val1);elsereturn N

16、ULL;Elementtype Topy(MAZE S)/返回縱坐標(biāo)函數(shù)if(S->next)return(S->next->val2);elsereturn NULL;另一種方法實(shí)現(xiàn)的迷宮代碼#ifndef MMIGONG_H#define MMIGONG_H#define MAX_SIZE 100#include<iostream>using namespace std;struct Nodeint x;int y;int di;class Stackprivate:int rrow;int ccolm;int top;int count;int minlen

17、ght;Node stackMAX_SIZE;Node sstackMAX_SIZE;public:Stack(); /初始化/int *InsortMiGong(); /輸入迷宮(即一個(gè)二維數(shù)組)void FindPath(int ab10); /找出迷宮的出路;Stack:Stack() /初始化rrow=0;ccolm=0;top=-1;count=1;minlenght=MAX_SIZE;/*int * Stack:InsortMiGong() /輸入迷宮(即一個(gè)二維數(shù)組)int row=1,colm=1;while(true)cout<<"請(qǐng)輸入迷宮的行數(shù)和列數(shù)

18、:"cin>>row>>colm;if(row<=0|colm<=0)cout<<"輸入錯(cuò)誤!請(qǐng)重新輸入:"<<endl;rrow=row;ccolm=colm;continue;elserrow=row;ccolm=colm;break;int *mg;cout<<"請(qǐng)輸入迷宮矩陣(只有0和1兩個(gè)數(shù)構(gòu)成):"for(int i=0;i<row;i+)for(int j=0;j<colm;j+)cin>>mgij;return mg;*/void S

19、tack:FindPath(int ab10) /找出迷宮的出路int a,b,di,find,k;top+;stacktop.x=1;stacktop.y=1;stacktop.di=-1;ab11=-1;while(top>-1)a=stacktop.x;b=stacktop.y;di=stacktop.di;if(a=8&&b=8)cout<<count+<<":"<<endl;for(int k=0;k<=top;k+)cout<<"("<<stackk.x&

20、lt;<","<<stackk.y<<")"if(!(k+1)%15)cout<<endl;cout<<endl;if(top+1<minlenght)for(k=0;k<=top;k+)sstackk=stackk;minlenght=top+1;abstacktop.xstacktop.y=0;top-;a=stacktop.x;b=stacktop.y;di=stacktop.di;find=0;while(di<8&&!find)di+;switch(di)c

21、ase 0:a=stacktop.x-1;b=stacktop.y;break;case 1:a=stacktop.x;b=stacktop.y+1;break;case 2:a=stacktop.x+1;b=stacktop.y;break;case 3:a=stacktop.x;b=stacktop.y-1;break; if(abab=0)find=1;if (find=1) stacktop.di=di;top+;stacktop.x=a;stacktop.y=b;stacktop.di=-1;abab=-1;elseabstacktop.xstacktop.y=0;top-;cout<<endl;cout<

溫馨提示

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

評(píng)論

0/150

提交評(píng)論