回 帖 发 新 帖 刷新版面

主题:求迷宫程序

小弟是刚接触数据结构的菜鸟。希望大家照顾下!求迷宫程序,帮帮忙![em8]

回复列表 (共7个回复)

沙发

用栈来写呀。严老太的书上不是有吗?

板凳

He just wants the code, and does not want to learn...

3 楼

用VC6.0做的,我当时可是呕心沥血啊,望你珍视
#include"iostream.h"
#define  MAXSIZE 1024
#define m 6
#define n 8
typedef struct node1{int x,y;}item;
typedef struct node2{int x,y,d;}sanwei;
typedef struct node3{sanwei data[MAXSIZE];int top;}Seqstack;//定义栈类型
////初始化栈
Seqstack *Init_Seqstack()
{
    Seqstack *s;
    s=new Seqstack;
    if(!s)
    {
        cout<<" 空间不足"<<endl;
        return NULL;
    }
    else{
        s->top=-1;
        return s;}
}
//判断栈空
int Empty_Seqstack(Seqstack *s)
{
    if(s->top==-1)
        return 1;
    else 
        return 0;
}
//入栈
int Push_Seqstack(Seqstack *s,sanwei x)
{
    if(s->top==MAXSIZE-1)
        return 0;
    else
    {
        s->top++;
        s->data[s->top].x=x.x;
        s->data[s->top].y=x.y;
        s->data[s->top].d=x.d; 
        return 1;
    }
}
//出栈
int Pop_Seqstack(Seqstack *s,sanwei *x)
{
    if(Empty_Seqstack(s))
        return 0;
    else
    {
        *x=s->data[s->top];
        s->top--;
        return 1;
    }
}
//迷宫
int path(int maze[m+2][n+2],item move[8])
{
    Seqstack s;
    s=*Init_Seqstack();
    sanwei temp;
    int x,y,d,i,j;
    temp.x=1;
    temp.y=1;
    temp.d=-1;
    Push_Seqstack(&s,temp);
    while(!Empty_Seqstack(&s))
    {
        Pop_Seqstack(&s,&temp);
        x=temp.x;
        y=temp.y;
        d=temp.d+1;
        while(d<8)
        {
            i=x+move[d].x;
            j=y+move[d].y;
            if(maze[i][j]==0)
            {
                temp.x=x;
                temp.y=y;
                temp.d=d;
                Push_Seqstack(&s,temp);//坐标及方向入栈
                x=i;
                y=j;
                maze[x][y]=-1;//到达新点
                if(x==m&&y==n)
                {
                    cout<<"There is a way:";
                    int x,y,d;
                    for(;s.top!=-1;s.top--)
                    {x=s.data[s.top].x;y=s.data[s.top].y;d=s.data[s.top].d;cout<<x<<y<<d<<"  ";}//输出路径
                    return 1;
                }//迷宫有路
                else
                    d=0;
            }
            else
                d++;
        }//while(d<8)
    }//while
    return 0;//迷宫无路
}
int main()
{
    item move[8];
    int maze[m+2][n+2];
    move[0].x=0; move[0].y=1;
    move[1].x=1; move[1].y=1;
    move[2].x=1; move[2].y=0;
    move[3].x=1; move[3].y=-1;
    move[4].x=0; move[4].y=-1;
    move[5].x=-1;move[5].y=-1;
    move[6].x=-1;move[6].y=1;
    move[7].x=-1;move[7].y=1;//初始化move[8]    
    int i,j;
    for(i=0;i<=m+1;i++)
        for(j=0;j<=n+1;j++)
            maze[i][j]=1;//初始化迷宫矩阵
    cout<<"Please input i j(end with 0 0):";
    cin>>i>>j;        
    while((i+j)!=0)            
    {            
        maze[i][j]=0;            
        cin>>i>>j;        
    }                        //用户自定义迷宫
    for(i=0;i<=m+1;i++)            
    {            
        for(j=0;j<=n+1;j++)
            cout<<maze[i][j]<<"   ";    //输出迷宫矩阵        
        cout<<endl;
    }
    int  q;
    q=path(maze,move);
    if(!q)
        cout<<"There is not a such way"<<endl;
    return 1;
}

4 楼

楼上的,写这个花了多少时间?

5 楼

我这个人比较笨,大约写了一周吧

6 楼

3楼强人,水平和我差不多,呵呵

7 楼

#include"stdio.h"
#include"stdlib.h"
#include"iostream.h"
#define m 4
#define n 4
struct stype//设置一个迷宫节点的数据结构
{int x,y;//每个迷宫格子的坐标
}stack[400];

int mg[m+1][n+1];//设置整个寻找区间(四周外加一层障碍以便对边缘节点索)
int zx[8],zy[8];//设置八个寻找方向
void printlj(int TOP)//输出最短路径
{int i;

  for(i=1;i<=TOP;i++)
  {printf("(%d,%d)",stack[i].x,stack[i].y);
   
  }

}

void mglj()
{int i,j,x,y,top,find,v,flag;
top=1;
flag=0;
stack[1].x=1;stack[1].y=1;
find=0;
  mg[1][1]=-1;

  while(top>=1&&!find))//深度优先的搜索技术
{x=stack[top].x;
  y=stack[top].y;
   for(v=1;v<=8;v++)//扫描八个可以走的方向
   {i=x+zx[v];
    j=y+zy[v];
  if(mg[i][j]==0)//找到一个可以走的方向进入栈
  {top++;
   stack[top].x=i;
       stack[top].y=j;
  
   mg[i][j]=-1;//避免重复选择
   flag=1;     //标志在当前点可以找到一个可以走的方向
      break;           //不再对当前节点扫描
  }
     
  if(v==8)//八个方向已经被全部扫描过,无可以通的路
  {flag=0;//标志当前节点没有往前的路
  top--;  //后退一个节点搜索
  }
  

   }
   
  if((stack[top].x ==m)&&(stack[top].y ==n))//找到了目的地
  {printlj(top);//输出
  find=1;       //退出循环

  }



   

}
if(!find) printf("不存在路径\n");
}

void main()
{int i,j;
for(i=1;i<=m;i++)        //输入迷宫图形 0表示可以通 1表示不可以通
for(j=1;j<=n;j++)
scanf("%d",&mg[i][j]);

for(i=0;i<=m+1;i++)        //设置四周障碍
{mg[i][0]=1;mg[i][n+1]=1;
}
for(j=0;i<=n+1;i++)       
{mg[0][j]=1;mg[m+1][j]=1;
}

zx[1]=-1;zx[2]=-1;zx[3]=0;zx[4]=1; //设置方向
zx[5]=1;zx[6]=1;zx[7]=0;zx[8]=-1;
zy[1]=0;zy[2]=1;zy[3]=1;zy[4]=1;
zy[5]=0;zy[6]=-1;zy[7]=-1;zy[8]=-1;
mglj();
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册