zoukankan      html  css  js  c++  java
  • 【堆栈应用二】迷宫算法,可直接动态运行

      1 #include<iostream>
      2 #include<fstream>
      3 #include<stack>
      4 #include<Windows.h>
      5 using namespace std;
      6 struct Position //定义坐标结构
      7 {
      8     int row, col;
      9 };
     10 class Maze
     11 {
     12 public:
     13     void ReadTxt();
     14     void DisplayMaze();
     15     bool FindPath();
     16     void WalkPath();
     17 
     18 private:
     19     int n;
     20     int step;
     21     int maze[100][100];
     22     stack<Position> path;//定义路线堆栈
     23 };
     24 
     25 void Maze::ReadTxt()//读入txt文件
     26 {
     27     
     28     ifstream inFile;
     29     inFile.open("maze.txt");
     30     inFile>>n;
     31     for(int i=0;i<n;i++)
     32         for(int j=0;j<n;j++)
     33             inFile>>maze[i][j];
     34     inFile.close();
     35 }
     36 
     37 void Maze::DisplayMaze()//打印原始迷宫
     38 {
     39     for(int i=0;i<n;i++)
     40     {
     41         for(int j=0;j<n;j++)
     42         {
     43             if((i==1&&j==0)||(i==n-2&&j==n-1))
     44                 cout<<"=>";
     45             else if(maze[i][j]==1)
     46                 cout<<"##";
     47             else cout<<"  ";
     48         }
     49         cout<<endl;
     50     }
     51 }
     52 bool Maze::FindPath()//找到路线并显示,无则给出“no path”信息
     53 {
     54     bool IfPath=true;
     55     Position offset[4];
     56     offset[0].row = 0; offset[0].col = 1; //
     57     offset[1].row = 1; offset[1].col = 0; //
     58     offset[2].row = 0; offset[2].col = -1; //
     59     offset[3].row = -1; offset[3].col = 0; //
     60 
     61     int a[100][100];
     62     for(int i=0;i<n;i++)
     63         for(int j=0;j<n;j++)
     64             a[i][j]=maze[i][j];
     65     Position here;
     66     here.row = 1;
     67     here.col = 0;
     68     a[1][0] = 1; // 避免返回起点
     69 
     70     int option = 0; // 下一动作的方向
     71     int LastOption = 3;
     72 
     73     while (here.row != (n-2) || here.col != (n-2)) //循环直到到达终点
     74     {
     75         int r,c;
     76         while (option <= LastOption) //找到下一动作的方向
     77         {
     78             r = here.row + offset[option].row;
     79             c = here.col + offset[option].col;
     80             if (a[r][c] == 0) break;
     81             option++; // 切换下一方向
     82         }
     83 
     84         if (option <= LastOption) //如果下一动作可行,即有一个方向可行
     85         {
     86             path.push(here);//将此刻的位置压入栈中
     87             here.row = r; 
     88             here.col = c;
     89             a[r][c] = 1;//将此刻的位置设为不可行
     90             option = 0;//将option归零
     91         }
     92         else //如果下一动作不可行,回溯
     93         {
     94             if(path.empty()) {IfPath= false;break;}//堆栈空,不可回溯,无解
     95             Position next=path.top();//弹出堆栈,设置option
     96             path.pop();
     97             if (next.row == here.row)
     98                 option = 2 + next.col - here.col;
     99             else option =3+ next.row - here.row;        
    100             here = next;
    101         }
    102     }
    103     if(IfPath==true)
    104     {
    105         int step=0;
    106         Position a;
    107         a.row=n-2;a.col=n-2;
    108         path.push(a);
    109         stack<Position> tmp;
    110         while(!path.empty ())
    111         {
    112             tmp.push(path.top());
    113             path.pop();
    114         }
    115         while(!tmp.empty())
    116         {
    117             cout<<'('<<tmp.top().row<<','<<tmp.top().col<<')'<<"->";
    118             path.push(tmp.top());
    119             tmp.pop();
    120             step++;
    121         }
    122         cout<<endl<<"the number of the total steps: "<<step<<endl;
    123     }
    124     else  cout<<"no path"<<endl;
    125     return IfPath;
    126 }
    127 void Maze::WalkPath()//动态显示
    128 {
    129     stack<Position> tmp;
    130 
    131     while(!path.empty ())
    132     {
    133         tmp.push(path.top());
    134         path.pop();
    135     }
    136 
    137     while(!tmp.empty())
    138     {
    139         system("cls");
    140         for(int i=0;i<n;i++)
    141     {
    142         for(int j=0;j<n;j++)
    143         {
    144             if((i==1&&j==0)||(i==n-2&&j==n-1))
    145                 cout<<"=>";
    146             else if(i==tmp.top().row&&j==tmp.top().col)
    147             {
    148                 cout<<"";
    149             }
    150             else if(maze[i][j]==1)
    151                 cout<<"##";
    152             else cout<<"  ";
    153         }
    154         cout<<endl;
    155     }
    156         path.push(tmp.top());
    157         tmp.pop();
    158         Sleep(250); 
    159     }
    160 }
    161 #include<iostream>
    162 #include<Windows.h>
    163 #include<conio.h>
    164 using namespace std;
    165 int main()
    166 {
    167     Maze maze1;
    168     maze1.ReadTxt();
    169     maze1.DisplayMaze();
    170     bool t=maze1.FindPath();
    171     
    172     if(t==1)
    173     {
    174         char s;
    175         cout<<endl<<"按任意键开始动态显示迷宫路径."<<endl;
    176         getch();
    177         maze1.WalkPath();
    178     }
    179     system("pause");
    180     return 0;
    181 }
  • 相关阅读:
    angular学习的一些小笔记(中)之双向数据绑定
    angular学习的一些小笔记(中)之ng-init
    angular学习的一些小笔记(中)之directive
    原型函数
    哇 真的是一个好插件!!!Sublime Text编辑文件后快速刷新浏览器
    angular学习的一些小笔记(中)之表单验证
    letter-spacing
    Emit学习(2)
    Emit学习(1)
    redis漏洞攻击
  • 原文地址:https://www.cnblogs.com/tenderwx/p/5292089.html
Copyright © 2011-2022 走看看