利用堆棧實現走迷宮算法


數據結構:堆棧

算法思想:堆棧彈棧,壓棧,回溯法

 

 

  1 //迷宮問題
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #define m 9
  5 #define n 9 
  6 #define MAXSIZE 100 
  7 //迷宮問題
  8 
  9 //定義移動位置 ,其中 
 10 typedef struct{
 11     int x,y;
 12 }item;
 13 //定義一個數據類型為dataType,在棧里面存在此數據
 14 //主要作為迷宮移動位置的臨時存放點,其中x為當前位置的橫坐標,y為當前位置的縱坐標
 15 //d為 搜索的次數(方向) 
 16 typedef struct{
 17     int x,y,d;
 18 }dataType; 
 19 
 20 //定義一個棧 
 21 typedef struct{
 22     dataType data[MAXSIZE];
 23     int top; 
 24 }list,*pList;
 25 
 26 
 27 //創建棧
 28 
 29 pList initList(){
 30     pList p;
 31     p = (pList)malloc(sizeof(list));
 32     if(p){
 33         p->top = -1;
 34     }
 35     
 36     return p; 
 37 } 
 38 
 39 //判斷棧是否為空
 40 int isEmpty(pList p){
 41     if(p->top==-1){
 42         return 1;//如果是空棧就返回1 
 43     }else{
 44         return 0;
 45     }
 46 }
 47 
 48 //壓棧
 49 int pushList(pList p,dataType data){
 50     if(p->top==MAXSIZE-1){//如果棧超出了大小,返回0 
 51         return 0;
 52     }
 53     p->top++;
 54     p->data[p->top] = data;//壓棧操作
 55     return 1;//壓棧成功,返回1 
 56 }
 57 
 58 //彈棧
 59 int popList(pList p,dataType *data){
 60     if(isEmpty(p)){
 61         return 0;//如果是空棧,就不彈,直接返回0 
 62     }else{
 63         *data = p->data[p->top];
 64         p->top--;
 65         return 1;
 66     } 
 67 }
 68 
 69 //銷毀棧
 70 void destory(pList *p){
 71     if(*p){
 72         free(*p);
 73     }
 74     *p = NULL;
 75     return; 
 76 } 
 77  
 78 int mazePath(int maze[][n+2],item move[],int x0,int y0){//maze表示一個迷宮的數組,move表示當前探索,x0,y0表示初始位置
 79     pList p;//定義棧
 80     dataType temp;//定義臨時位置 
 81     int x,y,d,i,j;//x,y用來存放臨時位置的角標,d表示臨時的探索次數,i,j所在位置的迷宮角標
 82     p = initList();//創建棧
 83     if(!p){//如果創建失敗 
 84         printf("創建棧失敗");
 85         return 0;  
 86     }
 87     
 88     //初始化走過的位置 
 89     temp.x = x0;
 90     temp.y = y0;
 91     temp.d = -1;
 92     
 93     //把迷宮入口壓棧
 94     pushList(p,temp);
 95     
 96     //當棧里面不為空時 
 97     while(!isEmpty(p)){
 98         popList(p,&temp);//彈棧
 99         x = temp.x;
100         y = temp.y;
101         d = temp.d+1;//給d+1,讓其進行第一次探索
102         while(d<4){//四次探索 
103             i = x+move[d].x;//原來的位置加上探索的位置
104             j = y+move[d].y;
105             
106             //當某條路是通路的時候 
107             if(maze[i][j]==0){//表示此路可走 
108                 //使用temp來保存路徑 
109                 temp.x = x;
110                 temp.y = y;
111                 temp.d = d;
112                 //將路徑壓棧
113                 pushList(p,temp);
114                 //x、y來保存當前新的路徑 
115                 x = i;
116                 y = j; 
117                 maze[x][y] = -1;//把走過的路徑的值設為-1 
118                 
119                 if(x==m && y==n){//判斷是否走到頭,如果走到頭 
120                     while(!isEmpty(p)){//如果棧不為空 
121                         popList(p,&temp);//彈棧
122                         printf("(%d,%d,%d),<-",temp.x,temp.y,temp.d);//打印路徑 
123                     }
124                     //程序結束,銷毀棧
125                     destory(&p);
126                     return 1; 
127                 }else{//如果能走通,但是卻沒有走完迷宮,把d置為0 
128                     d = 0;
129                 } 
130             } else{//如果路不通,換個方向在進行探索 
131                 d++; 
132             } 
133         } 
134          
135     }
136     //如果最后都沒找到,說明迷宮沒有通路
137         destory(&p);
138         return 0; 
139      
140 } 
141 
142 void main(){
143     item move[4];//定義一個控制探索路徑的移動數組
144     //定義迷宮數組 
145      int maze[11][11]={
146                   {1,1,1,1,1,1,1,1,1,1,1},
147                  {1,0,0,0,1,0,1,1,1,0,1},
148                  {1,0,1,0,0,0,0,1,0,1,1},
149                  {1,0,0,1,0,0,0,1,0,0,1},
150                  {1,1,0,1,0,1,0,1,0,1,1},
151                  {1,0,1,0,1,0,0,1,0,0,1},
152                  {1,0,0,0,0,0,1,0,1,0,1},
153                  {1,1,1,1,0,1,0,0,0,0,1},
154                  {1,0,0,1,0,0,0,1,0,1,1},
155                  {1,0,0,0,0,1,0,1,0,0,1},
156                  {1,1,1,1,1,1,1,1,1,1,1}
157                  };
158     
159     //定義第一次移動 ,方向為北 
160     move[0].x = 0;
161     move[0].y = 1;
162     
163     //定義第二次移動,方向為南 
164     move[1].x = 0;
165     move[1].y = -1;
166     
167     //規定第三次移動,方向為東 
168     move[2].x = 1;
169     move[2].y = 0;
170     
171     //規定第三次移動,方向為西 
172     move[3].x = -1;
173     move[3].y = 0; 
174     
175     mazePath(maze,move,1,1); 
176 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM