• 利用堆栈解决迷宫问题


    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 }
  • 相关阅读:
    dpkg: error processing package XXX (--configure) 解决方法 (ubuntu右上角红色警告)
    overlay2 在打包发布流水线中的应用
    别总写代码,这130个网站比涨工资都重要
    csv 导出变成字符串
    mysql 报错 invalid data source name
    win10 phpredis扩展安装
    redis启动命令
    IDEA Plugins:Easycode(代码生成)安装及使用
    mysql设置自动更新时间
    IDEA快捷键之for循环
  • 原文地址:https://www.cnblogs.com/buptmemory/p/2861390.html
Copyright © 2020-2023  润新知