數據結構:堆棧
算法思想:堆棧彈棧,壓棧,回溯法

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 }