zoukankan      html  css  js  c++  java
  • 数据结构递归与非递归走迷宫

    今天做实验,走迷宫问题,要求用递归与非递归两种方法:

    要求:

    1)数据结构:

    ² 用二维数组MAZE[m+2][n+2]表示迷宫的结构,数组中的值为1表示是墙,为0表示可以走通。(用MAZE[m+2][n+2]而不用MAZE[m][n]的原因在于想表示和编写代码的时候简单些,而且让迷宫周围都是墙,防止错误的走出去)

    ² 用二维数组MARK[m+2][n+2]表示迷宫是否被走过,主要是为了回溯时已经证明走不通的路线就不要再去走了。(用MARK[m+2][n+2]而不用MARK[m][n]的原因在于想表示和编写代码的时候简单些)

    ² 二维数据MOVE[8][2]是为了更方便的移动到下一步,改变坐标。这个二维数组是为了更好的转换坐标(八个方向,从07),而且也能避免重复走路

    ² 用栈保存走过的路径

    2)输出:

    ² 迷宫布局,用0表示可以走通的地方,用1表示墙

    ² 如果能走通,则输出路径和路径的长度;若不能走通,则输出提示不能走通

    ² 带有路径的迷宫布局

    以下是代码:

    maze.h

     1 #include<stack>
     2 using namespace std;
     3 const int rowsize = 10;             //定义走通路径时数组的下标
     4 const int colsize = 11; 
     5 const int MOVE[8][2]={{0,1},{1,1},{1,0},{1,-1},{-1,0},{-1,-1},{0,-1},{-1,1}};    //定义路径
     6 struct step            //存放走通的路
     7 {
     8     int x;
     9     int y;
    10     int mov;
    11 };
    12 class Maze
    13 {
    14 public:
    15     Maze();
    16     int  getmaze(int i,int j);            //返回路径
    17     bool solve(int i, int j);         //递归算法
    18     bool path();                //非递归算法
    19     int maze[12][12];             //用于储存迷宫
    20     stack<step> STACK;         //用于储存步骤
    21 };

    maze.cpp

     1 #include"maze.h"
     2 #include<ctime>
     3 #include<cstdlib>
     4 #include<iostream>
     5 using namespace std;
     6 Maze::Maze()
     7 {
     8     srand((unsigned int) time(NULL));     //随机生成一个迷宫
     9     for(int i=0;i<12;i++)
    10     {
    11         for(int j=0;j<12;j++)
    12         {
    13             if(i!=0&&i!=11&&j!=0&&j!=11)
    14             {
    15                 maze[i][j]=(int)rand()%2;
    16             }
    17             else
    18                 maze[i][j]=1;
    19         }
    20     }
    21     maze[1][1]=0;         //将初位置和末位置都设为可以走通的状态'0'
    22     maze[10][10]=0;
    23     maze[10][11]=0;
    24 } 
    25 int Maze::getmaze(int i,int j)
    26     /*获取迷宫*/
    27 {
    28     return maze[i][j];
    29 }
    30 bool Maze::path()                //非递归算法
    31 {
    32     maze[1][1]='x';             //将第一个位置压栈
    33     int g=0,h=0;
    34     step STEP;
    35     STEP.x=1;
    36     STEP.y=1;
    37     STEP.mov=0;
    38     STACK.push(STEP);
    39     while(!STACK.empty())            //寻找路径
    40     {
    41         STEP=STACK.top();
    42         STACK.pop();
    43         while(STEP.mov!=8 )         //按八个方向寻找路径
    44         {
    45             g=STEP.x+MOVE[STEP.mov][0];
    46             h=STEP.y+MOVE[STEP.mov][1];
    47             if( g==rowsize && h==colsize)
    48             {
    49                 return true;         //迷宫可以走通
    50             }
    51             if (maze[g][h]==0)
    52             {
    53                 maze[g][h]='x';
    54                 STACK.push(STEP);
    55                 STEP.x=g;
    56                 STEP.y=h;
    57                 STEP.mov=0;
    58             }
    59             else
    60             {          
    61                 STEP.mov=STEP.mov+1;         //改变方向搜索
    62             }
    63         }
    64         if(STEP.mov==8) //若八个方向都走不通就把该位置标记为'Y'即表示该位置已经走过且走不通
    65         {
    66             maze[STEP.x][STEP.y]='Y';
    67             STEP.mov=0;
    68         }
    69     }
    70         return false;             //走不通
    71 }
    72 
    73 bool Maze::solve(int i,int j)
    74 {
    75     bool finish = false;
    76     maze[i][j] = 'X';
    77     if (i == rowsize && j == colsize)
    78         return true; // because we're done
    79     if (!finish && maze[i+1][j] == 0)
    80         finish = solve(i+1, j);
    81     if (!finish && maze[i][j+1] == 0)
    82         finish = solve(i, j+1);
    83     if (!finish && maze[i-1][j] == 0)
    84         finish = solve(i-1, j);
    85     if (!finish && maze[i][j-1] == 0)
    86         finish = solve(i, j-1);
    87     if (!finish && maze[i-1][j-1] == 0)
    88         finish = solve(i-1, j-1);
    89     if (!finish && maze[i-1][j+1] == 0)
    90         finish = solve(i-1, j+1);
    91     if (!finish && maze[i+1][j+1] == 0)
    92         finish = solve(i+1, j+1);
    93     if (!finish && maze[i+1][j-1] == 0)
    94         finish = solve(i+1, j-1);
    95     if (!finish) //无法走通,那么修改原来设置的X符号,但是不设置为0,因为这个点现在已经走过
    96         maze[i][j] = 'Y';
    97     return finish;
    98 }

    main.cpp

     1 #include<iostream>
     2 #include"maze.h"
     3 using namespace std;
     4 int main()
     5     {
     6     int i=0,j=0;
     7     Maze a;                //生成一个迷宫
     8     cout<<"非递归算法"<<endl;
     9     for(i=0;i<12;i++)        //显示一个迷宫
    10     {
    11         for(j=0;j<12;j++)
    12         {
    13             cout<<a.getmaze(i,j)<<"  ";
    14         }
    15             cout<<endl;
    16     }
    17     
    18 
    19     //非递归
    20     bool b;                //用于判断迷宫是否可以走通
    21     b=a.path();
    22     cout<<"----------------------------------------------------------------"<<endl;
    23     if(b==false)
    24         cout<<"不能走出迷宫"<<endl;
    25     else
    26     {
    27      cout<<"走出迷宫的路线为:"<<endl;
    28         cout<<"----------------------------------------------------------------"<<endl;
    29     for(i=0;i<12;i++)        //显示走出迷宫的路径
    30     {
    31         for(j=0;j<12;j++)
    32         {
    33             if(a.getmaze(i,j)==0||a.getmaze(i,j)==1)
    34             cout<<a.getmaze(i,j)<<"  ";
    35             else if(a.getmaze(i,j)=='Y')
    36                 cout<<'0'<<"  ";
    37             else
    38                 cout<<(char)a.getmaze(i,j)<<"  ";
    39         }
    40             cout<<endl;
    41     }
    42     }
    43     
    44     //显示走出迷宫的路径
    45     for(i=0;i<12;i++)        
    46     {
    47         for(j=0;j<12;j++)
    48         {
    49             if((char)a.getmaze(i,j)=='x')
    50             {
    51                 
    52                 cout<<"x="<<i<<"y="<<j<<"  ";
    53             }
    54         }
    55         cout<<endl;
    56     }
    57 
    58 
    59 
    60     //递归
    61     bool c;
    62     c=a.solve(1,1);
    63     cout<<c<<endl;
    64     if(c==false)
    65     {
    66         cout<<"不能走出迷宫!"<<endl;
    67     }
    68     else
    69     {
    70         for(i=0;i<12;i++)        
    71         {
    72             for(j=0;j<12;j++)
    73             {
    74                 if(a.getmaze(i,j)==0||a.getmaze(i,j)==1)
    75             cout<<a.getmaze(i,j)<<"  ";
    76             else if(a.getmaze(i,j)=='Y')
    77                 cout<<'0'<<"  ";
    78             else
    79                 cout<<(char)a.getmaze(i,j)<<"  ";
    80             }
    81             cout<<endl;
    82         }
    83     }
    84 
    85 
    86     for(i=0;i<12;i++)        
    87     {
    88         for(j=0;j<12;j++)
    89         {
    90             if((char)a.getmaze(i,j)=='X')
    91             {
    92                 
    93                 cout<<"x="<<i<<"y="<<j<<"  ";
    94             }
    95         }
    96         cout<<endl;
    97     }
    98     return 0;
    99 }

    一直都不怎么注意做笔记,弄得现在感觉好多东西就算做过了一会就忘了。

     

  • 相关阅读:
    移动端头部声明
    清除浮动绝招
    图片采用base64压缩,可以以字符串的形式传送base64给服务端转存为图片
    js cookie的封装和调用
    js 封装设计cookie
    div可编辑状态设置
    align使图片和文字居中
    布局如何做到自适应?
    Jmeter学习笔记四_压力测试
    Pycharm中配置Git版本管理
  • 原文地址:https://www.cnblogs.com/newworldcom/p/3751646.html
Copyright © 2011-2022 走看看