数据结构递归与非递归走迷宫

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

要求:

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 }

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

 

原文地址:https://www.cnblogs.com/newworldcom/p/3751646.html