走迷宫(4个方向,递推做)

#include <stdio.h>
#include "time.h"
#include <stdlib.h>
#include "math.h"
#define N 50
#define M 30
int visit(int, int);

int maze[N][M] ;

int success = 0;
 int startI,startJ,endI,endJ; // 入口和出口
int main() {

         int i, j;
  
   srand(time(0));
   for (i=0;i<N;i++)
   {
    for (j=0;j<M;j++)
    {
     if (i==0||i==N-1||j==0||j==M-1)
     {
      maze[i][j]=2;
     }
     else
     {
      maze[i][j]=rand()%200;
      if (maze[i][j]<70)
      {
       maze[i][j]=2;
      }
      else
      {
       maze[i][j]=0;
      }
     }
    }
   }
   for (i=1;i<=N-2;i++)
   {
    for (j=1;j<=M-2;j++)
    {
    
     if (maze[i+1][j]==0&&maze[i-1][j]==0&&maze[i][j-1]==0&&maze[i][j+1]==0) //孤独的一个墙不要
     {
      maze[i][j]=0;
     }
    
    }
   }
   for (i=1;i<=N-2;i++)
   {
    for (j=1;j<=M-2;j++)
    {
    
     if (maze[i+1][j+1]==2&&maze[i+1][j]==2&&maze[i][j+1]==2&&maze[i][j]==2)//把结块的墙分开
     {
      maze[i][j]=0;
     }
    
    }
   }
  
         printf("显示迷宫:/n");

         for(i = 0; i < N; i++) {

                   for(j = 0; j < M; j++){

                            if(maze[i][j] == 2)

                                     printf("█");

                            else

                                     printf("  ");

                   }

                   printf("/n");

         }
   printf("请输入起点坐标:/n");

   scanf("%d%d",&startI,&startJ);

   while(maze[startI][startJ]!=0)
   {printf("请输入的起点坐标是墙,请重新输入!/n");
   printf("请输入起点坐标:/n");
   scanf("%d%d",&startI,&startJ);}
       
   printf("请输入终点坐标:/n");
   scanf("%d%d",&endI,&endJ);
   while(maze[endI][endJ]!=0)
   {printf("请输入的终点坐标是墙,请重新输入!/n");
   printf("请输入终点坐标:/n");
   scanf("%d%d",&endI,&endJ);
   }
  


         if(visit(startI, startJ) == 0)

                   printf("/n没有找到出口!/n");

         else {

                   printf("/n显示路径:/n");

                   for(i = 0; i < N; i++) {

                            for(j = 0; j < M; j++) {

                                     if(maze[i][j] == 2)

                                               printf("█");

                                     else if(maze[i][j] == 1)

                                               printf("◇");

                                     else

                                               printf("  ");

                            }

                            printf("/n");

                   }

         }

         return 0;

}


int visit(int i, int j) {

         maze[i][j] = 1;

         if(i == endI && j == endJ)

                   success = 1;

         if(success != 1 && maze[i][j+1] == 0) visit(i, j+1);

         if(success != 1 && maze[i+1][j] == 0) visit(i+1, j);

         if(success != 1 && maze[i][j-1] == 0) visit(i, j-1);

         if(success != 1 && maze[i-1][j] == 0) visit(i-1, j);

         if(success != 1)          //注意

                   maze[i][j] = 0; //注意

         return success;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值