用纯C语言解决迷宫问题,简洁易懂

 

#include<malloc.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define M 50
#define N 50

typedef struct node     //迷宫节点结构体
{
 int row;  //行号
 int col;  //列号
 struct node *next; //下一个节点
}mazenode;
mazenode *stack;//定义一个栈

//寻找路径的函数,找到返回1,否则返回0
int findpath(int maze[][12],int x1,int x2,int y1,int y2)
{
 mazenode *p;
 if(maze[x1][y1]==0)
 {
    p=(mazenode *)malloc(sizeof(mazenode));
    printf("x1=%d, y1=%d, x2=%d, y2=%d\n", x1, y1, x2, y2);
    p->row=x1;
    p->col=y1;
    p->next=NULL;
       stack=p;          //将入口放入堆栈
    maze[stack->row][stack->col]=1;//标志入口已访问
    while((!(stack->row==-1&&stack->col==-1))&&(!(stack->row==x2&&stack->col==y2)))//未找到出口并且堆栈不空
  {
   if(maze[stack->row+1][stack->col]==0)  //下面可通
   {
       //printf("下\n");
    p=(mazenode *)malloc(sizeof(mazenode));
    p->row=stack->row+1;
    p->col=stack->col;
    p->next=stack;         //入栈
    stack=p;
    maze[stack->row][stack->col]=1; //标记已访问
   }
   else if(maze[stack->row][stack->col+1]==0)  //右面位置可通
   {
       //printf("右\n");
    p=(mazenode *)malloc(sizeof(mazenode));
    p->row=stack->row;
    p->col=stack->col+1;
    p->next=stack;           //入栈
    stack=p;
    maze[stack->row][stack->col]=1;//标记已访问
   }
   else if(maze[stack->row-1][stack->col]==0)  //左面可通
   {
       //printf("左\n");
    p=(mazenode *)malloc(sizeof(mazenode));
    p->row=stack->row-1;
    p->col=stack->col;
    p->next=stack;        //入栈
    stack=p;
    maze[stack->row][stack->col]=1;//标记已访问
   }
   else if(maze[stack->row][stack->col-1]==0)//上面可通
   {
       //printf("上\n");
    p=(mazenode *)malloc(sizeof(mazenode));
    p->row=stack->row;
    p->col=stack->col-1;
    p->next=stack;       //入栈
    stack=p;
    maze[stack->row][stack->col]=1;//标记已访问

   }
   else   //不可通返回上一点
   {
       //printf("返回\n");
    if (stack->next!=NULL)
    {            //堆栈里布置一个顶点则出栈并返回循环
        //printf("能返回\n");
       p=stack;
       stack=stack->next;   //出栈
       free(p);  //释放空间
    }
    else                   //堆栈里只有一个顶点即入口,此时若释放空间出栈会使循环
    {                      //控制语句无法比较(因为stack->col,stack->row都已不存在,)
       //printf("不能返回\n");
       stack->row=-1;
          stack->col=-1;
       stack->next=NULL;
    }
   }

  }
  if (stack->row==x2&&stack->col==y2)
            return 1;
        else
            return 0;

 }
 else
        return 0;
}

//打印路径函数
void printpath()
{
 mazenode *q;
 int i=1;
 printf("其中的一条通道为:\n");
     q=stack;
     printf("  出口<--");
     while (q!=NULL)
     {
      if(i%5==0)
       printf("\n");
      printf("[%d%3d]<--",q->row,q->col);
      q=q->next;
      i++;
     }
     printf("入口\n");
}


int main()
{
  system("color f0");   //背景为白色
  int k=1,a=10,b=10, z, i, j;
  int maze[12][12] ={{1,1,1,1,1,1,1,1,1,1,1,1},
                        {1,0,1,1,1,1,1,0,0,0,0,1},{1,0,0,0,0,0,1,0,1,0,0,1},{1,0,0,0,0,0,1,0,0,0,0,1},
                        {1,0,1,0,1,0,1,0,1,1,0,1},{1,0,1,0,1,0,1,0,1,0,0,1},{1,0,1,1,1,0,1,0,1,0,1,1},
                        {1,0,1,0,0,0,1,0,1,0,1,1},{1,0,1,0,0,1,1,0,1,0,1,1},{1,1,0,0,0,0,0,0,1,0,0,1},
                        {1,0,0,0,0,0,1,1,1,0,0,1},
                        {1,1,1,1,1,1,1,1,1,1,1,1}
                       };
  while(k!=0)
  {
     int x,x1,x2,y1,y2;
        printf("迷宫矩阵如下(0表示可通):\n   ");
        for(z=1;z<=b;z++)
        {
                printf("%d ",z);  //在矩阵上方标明列号
        }
        for(i=1;i<=a;i++)
        {
            printf("\n");
            if(i<10)
                printf("%d  ",i);  //在矩阵左方标明行号
            else
                printf("%d ",i);
            for(j=1;j<=b;j++)
                printf("%d ",maze[i][j]);
        }

     printf("\n迷宫入口为(1,1), 出口为(10,10)\n");
     x1=1, y1=1, x2=10, y2=10;
     x=findpath(maze,x1,x2,y1,y2);
        if(x==1)        //迷宫可通
        {
               printf("找到路径\n");
               printpath(); //打印坐标通路

        }
     else
     printf("无通路!\n");//不可通
    printf("输入0结束:\n");
    scanf("%d",&k);
  }
  return 0;
}

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值