现在的位置: 首页 > 综合 > 正文

数字迷宫思考-下

2019年10月08日 ⁄ 综合 ⁄ 共 3230字 ⁄ 字号 评论关闭

数字迷宫思考-

-----用递归的方法实现数字迷宫

数字迷宫,可以用栈和递归的方法实现。通常情况下,递归都比较容易实现,因此,试着用递归的方法来实现数字迷宫游戏。虽然递归相对比较简单,但是,当递归次数较多时,可能会造成代码空间的增大;另外,在最后显示通路路径的时候,存在一个问题:显示只能从出口到入口倒着显示路径信息,这是不方便的。不过,将递归当着一种方法来解决问题,也是值得尝试的。下附上数字迷宫的c++实现源代码。

 

/**********************************************************

Copyright@2009-2011 by hank(SiChuan University)

***********************************************************/

//Node.h

#ifndef NODE_H

#define NODE_H

//坐标偏移及方向

struct offset

{

       int a,

              b;

       char* dir;

};

#endif

/**********************************************************

Copyright@2009-2011 by hank(SiChuan University)

***********************************************************/

//Maze.h

#ifndef    MAZE_H

#define    MAZE_H

#include"Node.h"

//路径搜索函数

bool pathSearch(int sx,int sy,int Maze[][10],int Mark[][10],int ex,int ey);

 

#endif

/**********************************************************

Copyright@2009-2011 by hank(SiChuan University)

***********************************************************/

//Maze.cpp

#include"Maze.h"

#include<iostream>

#include<cstdlib>

using namespace std;

bool pathSearch(int sx,int sy,int Maze[][10],int Mark[][10],int ex,int ey)

{

       offset move[8]={{-1,0,"N"},{-1,1,"NE"},{0,1,"E"},{1,1,"SE"},{1,0,"S"},{1,-1,"SW"},{0,-1,"W"},{-1,-1,"NW"}};

       if(sx==ex && sy==ey)

       {

              //输出出口节点

              cout<<"("<<sx<<","<<sy<<","<<move[4].dir<<")"<<endl;

              return true;

       }

       int g,h;

       char* d;

       for(int i=0;i<8;i++)

       {

              g=sx+move[i].a;

              h=sy+move[i].b;

              d=move[i].dir;

              if(Maze[g][h]==0 && Mark[g][h]==0)

              {

                     Mark[g][h]=1;

                     if(pathSearch(g,h,Maze/*[][10]*/,Mark/*[][10]*/,ex,ey))//注意这里的引用方式

                     {

                            cout<<"("<<sx<<","<<sy<<","<<d<<")"<<endl;

                            return true;

                     }

              }

       }

       if(sx==1 && sy==0)

              cout<<"没有路径!"<<endl;

       Mark[1][0]=1;

       return false;

}

/**********************************************************

Copyright@2009-2011 by hank(SiChuan University)

***********************************************************/

//main.cpp

#include"Maze.h"

#include<iostream>

using namespace std;

 

int main()

{

       int m=10,

              p=10;

    int Mark[10][10];

       for(int i=0;i<10;i++)

              for(int j=0;j<10;j++)

                     Mark[i][j]=0;

             

       int Maze[10][10]={{1,1,1,1,1,1,1,1,1,1},

       {0,0,0,1,1,0,1,1,0,1},{1,1,1,0,0,1,1,0,1,1},{1,1,0,1,1,0,0,1,1,1},

       {1,0,1,1,0,1,1,0,1,1},{1,1,0,1,1,1,1,1,0,1},{1,0,1,1,0,1,0,0,1,1},

       {1,0,1,0,1,1,1,1,1,1},{1,1,0,1,0,0,0,1,1,1},{1,1,1,1,1,1,1,0,1,1}};

       cout<<"***************迷宫阵型图**************"<<endl;

 

       for(int ii=0;ii<10;ii++)

       {

              for(int jj=0;jj<10;jj++)

                     cout<<Maze[ii][jj]<<" ";

              cout<<endl;

       }

       int sx=1,

              sy=0,

              qr=9,

              qc=7;

       cout<<"******从出口到入口逆向显示路径:*******"<<endl;

       bool out=pathSearch(sx,sy,Maze,Mark,qr,qc);

       cout<<endl;

 

       cout<<"*************显示走过的路径***********"<<endl;

       for(int k=0;k<10;k++)  

       {

              for(int m=0;m<10;m++)

                     cout<<Mark[k][m]<<" ";

              cout<<endl;

       }

       cout<<"***************测试结束***************"<<endl;

       return 0;

}

抱歉!评论已关闭.