栈-迷宫问题

一、程序源代码:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #include <stdio.h>
  5 
  6 #define M 2
  7 #define N 2
  8 #define MAXSIZE 20
  9 #define RIGHT 0
 10 #define DOWN  1
 11 #define LEFT  2
 12 #define UP    3
 13 #define DIRECTIONS 4
 14 
 15 typedef struct datatype
 16 {
 17  int x;
 18  int y;
 19  int d;
 20  char dir[6];
 21 }datatype;
 22 
 23 int maze[M][N]={
 24     0,1,
 25     0,0,
 26 };
 27 
 28 typedef struct seqstack
 29 {
 30     datatype data[MAXSIZE];
 31     int top;
 32 }seqstack;
 33 seqstack seq;
 34 seqstack *s;
 35 datatype temp;
 36 
 37 void print_maze()
 38 {
 39     int i,j;
 40     for(i=0;i<M;i++)
 41     {
 42         if(i == 0)
 43         {
 44             printf("   ");
 45             for(j=0;j<N;j++)
 46                 printf("C%d ",j);
 47             printf("\n");
 48         }
 49         printf("R%d ",j);
 50 
 51         for(j=0;j<N;j++)
 52             printf("%2d",maze[i][j]);
 53         printf("\n");
 54     }
 55 }
 56 
 57 int push_stack(seqstack *s,datatype x)
 58 {
 59     if(s->top == MAXSIZE -1 )
 60         return 0;
 61     else
 62     {
 63         s->top++;
 64         s->data[s->top]=x;
 65         return 1;
 66     }
 67 }
 68 
 69 int empty_stack(seqstack *s)
 70 {
 71     if(s->top == 0)
 72         return 1;
 73     else
 74         return 0;
 75 }
 76 
 77 int pop_stack(seqstack *s,datatype *x)
 78 {
 79     if(empty_stack(s))
 80         return 0;
 81     else
 82     {
 83         *x= s->data[s->top];
 84         s->top--;
 85         return 1;
 86     }
 87 }
 88 
 89 int mazepath(int maze[][N],datatype move[])
 90 {
 91     int x=0, y=0;
 92     int i=0,j=0;
 93     int d=-1;
 94 
 95     temp.x=0;
 96     temp.y=0;
 97     temp.d=-1;
 98     maze[0][0]=-1;
 99     push_stack(s,temp);
100 
101     while(!empty_stack(s))
102     {
103         pop_stack(s,&temp);
104         x=temp.x;
105         y=temp.y;
106         d=temp.d+1;
107 
108         while(d < DIRECTIONS)
109         {
110             switch(d)
111             {
112                 case RIGHT:
113                     if( y == N-1)
114                         d++;
115                     else
116                         j = y + move[d].y;
117                     i = x + move[d].x;
118                     break;
119                 case DOWN:
120                     if(x == M-1)
121                         d++;
122                     else
123                         i = x + move[d].x;
124                     j = y + move[d].y;
125                     break;
126                 case LEFT:
127                     if( y == 0)
128                         d++;
129                     else
130                         j = y + move[d].y;
131                     i = x + move[d].x;
132 
133 
134                     break;
135                 case UP:
136                     if(x == 0)
137                         d++;
138                     else
139                         i = x + move[d].x;
140                     j = y + move[d].y;
141                     break;
142             }
143 
144             if(maze[i][j] == 0)
145             {
146                 temp.x=x;
147                 temp.y=y;
148                 temp.d=d;
149                 push_stack(s,temp);
150                 x=i;
151                 y=j;
152                 if((x+1) == M && (y+1) == N)
153                     return 1;
154                 else
155                     d=0;
156             }
157             else
158                 d++;
159         }
160 
161         return 0;
162     }
163 }
164 
165 int main()
166 {
167     int r;
168     int x=0,y=0;
169 
170     datatype move[4]={
171         0, 1, 0, "RIGHT",
172         1, 0, 1, "DOWN",
173         0,-1, 2, "LEFT",
174        -1, 0, 3, "UP",
175     };
176 
177     s=&seq;
178     printf("The maze array:\n");
179     print_maze();
180     r=mazepath(maze,move);
181     if(r == 1)
182     {
183         printf("The valid path is (step from exit to entry):\n");
184         while(!empty_stack(s))
185         {
186             pop_stack(s,&temp);
187             printf("<%d, %2d>,%s\n",temp.x,temp.y,move[temp.d].dir);
188         }
189     }
190     else
191         printf("There is not a valid path!\n");
192     return 0;
193  } 

二、执行结果:       

The maze array:
   C0 C1 
R2  0 1
R2  0 0
The valid path is (step from exit to entry):
<1,  0>,RIGHT
<0,  0>,DOWN

三、收获:

     1.熟悉了栈:判断栈空,入栈,出栈......

     2.多种数据结构的定义

     3.迷宫问题有了初步认识

四、不足之处:

     1.对迷宫问题逻辑还不是很强,还可以再仔细分析一下,找出能计算出多种结果的方案。

     2.还总结比较一下堆栈的使用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值