利用堆栈解决迷宫问题

View Code
  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 const int SIZE_X=10;
  6 const int SIZE_Y=10;
  7 
  8 //data struct
  9 class mPoint
 10 {
 11 public:
 12     mPoint(int rx=0,int ry=0,bool rcan_move_to=false)
 13     {
 14         x=rx;
 15         y=ry;
 16         can_move_to=rcan_move_to;
 17         next=NULL;
 18     }
 19 public:
 20     mPoint *next;
 21     int x;
 22     int y;
 23     bool can_move_to;
 24 };
 25 
 26 //function declaration
 27 class mStack
 28 {
 29 public:
 30     mStack();//constructor
 31     int push(mPoint point);
 32     mPoint pop();
 33     int getLength();
 34     mPoint getTop();
 35     void printStack();
 36 private:
 37     mPoint *base;//base pointer
 38     mPoint *top; //top pointer
 39     int length; //length of stack
 40 };
 41 
 42 
 43 mStack::mStack()
 44 {
 45     length=0;
 46     base=NULL;
 47     top=NULL;
 48 }
 49 int mStack::push(mPoint point)
 50 {
 51     mPoint *mpNode=new mPoint();
 52     *mpNode=point;
 53     if(length==0)
 54         top=base=mpNode;
 55     else
 56     {
 57         top->next=mpNode;
 58         top=mpNode;
 59     }
 60     return ++length;
 61 }
 62 mPoint mStack::getTop()
 63 {
 64     return *top;
 65 }
 66 mPoint mStack::pop()
 67 {
 68     if(length<=0)
 69         return NULL;
 70     mPoint retPoint=*top;
 71     top=base;
 72     while(top->next!=NULL)
 73     {
 74         if(top->next->next==NULL)
 75         {
 76             delete(top->next);
 77             top->next=NULL;
 78             break;
 79         }
 80         top=top->next;
 81     }
 82     if(length==1)
 83     {
 84         delete(base);
 85         base=top=NULL;
 86     }
 87     length--;
 88     return retPoint;
 89 }
 90 
 91 int mStack::getLength()
 92 {
 93     return length;
 94 }
 95 void mStack::printStack()
 96 {
 97     mPoint *p=base;
 98     while(p!=NULL)
 99     {
100         cout<<"("<<p->x<<","<<p->y<<")"<<endl;
101         p=p->next;
102     }
103    
104 }
105 
106 int main()
107 {
108     mPoint mpArray[SIZE_X][SIZE_Y];
109     bool initArray[SIZE_X][SIZE_Y]={
110     {false,false,false,false,false,false,false,false,false,false},
111     {false,true ,true ,false,true ,true ,true ,false,true ,false},
112     {false,true ,true ,false,true ,true ,true ,false,true ,false},
113     {false,true ,true ,true ,true ,false,false,true ,true ,false},
114     {false,true ,false,false,false,true ,true ,true ,true ,false},
115     {false,true ,true ,true ,false,true ,true ,true ,true ,false},
116     {false,true ,false,true ,true ,true ,false,true ,true ,false},
117     {false,true ,false,false,false,true ,false,false,true ,false},
118     {false,false,true ,true ,true ,true ,true ,true ,true ,false},
119     {false,false,false,false,false,false,false,false,false,false}};//迷宫矩阵
120     for(int i=0;i<SIZE_X;i++)//init
121     {
122         for(int j=0;j<SIZE_Y;j++)
123         {
124             mpArray[i][j].x=i;
125             mpArray[i][j].y=j;
126             mpArray[i][j].can_move_to=initArray[i][j];
127         }
128     }
129     mPoint startp(1,1,true);//entry
130     mPoint endp(8,8,true);  //exit
131    
132     mStack mpath;
133     mpath.push(startp);
134    
135     mPoint mp=startp;
136     while(true)
137     {
138         if(mp.x==endp.x && mp.y==endp.y)
139             break;//success
140         if(mpArray[mp.x+1][mp.y].can_move_to)//search down
141         {
142             mpArray[mp.x+1][mp.y].can_move_to=false;
143             mpath.push(mPoint(mp.x+1,mp.y));
144             mp=mpArray[mp.x+1][mp.y];
145             continue;
146         }
147         if(mpArray[mp.x-1][mp.y].can_move_to)//search up
148         {
149             mpArray[mp.x-1][mp.y].can_move_to=false;
150             mpath.push(mPoint(mp.x-1,mp.y));
151             mp=mpArray[mp.x-1][mp.y];
152             continue;
153         }
154         if(mpArray[mp.x][mp.y+1].can_move_to)//search right
155         {
156             mpArray[mp.x][mp.y+1].can_move_to=false;
157             mpath.push(mPoint(mp.x,mp.y+1));
158             mp=mpArray[mp.x][mp.y+1];
159             continue;
160         }
161         if(mpArray[mp.x][mp.y-1].can_move_to)//serch left
162         {
163             mpArray[mp.x][mp.y-1].can_move_to=false;
164             mpath.push(mPoint(mp.x,mp.y-1));
165             mp=mpArray[mp.x][mp.y-1];
166             continue;
167         }
168         if(0==mpath.getLength())
169         {
170             cout<<"No path!"<<endl;
171             return -1;
172         }
173         mpath.pop();
174         mp=mpath.getTop();
175     }
176     cout<<"Path:"<<endl;
177     mpath.printStack();//ouput path
178    
179     return 0;
180 }

 

posted on 2013-01-15 16:08  mymemory  阅读(381)  评论(0编辑  收藏  举报

导航