(回溯法) 数据结构_回溯法求解迷宫路径

描述:

     打印出迷宫图形,寻找迷宫路径,输入y显示路径,输入其他退出程序,利用简单图形,具有较好的人机交互性。

 

#include <stdio.h>
#include <stdlib.h>
int success=0;
char a;              //定义全局变量(任何函数都可以利用他的值和改变他的值)
int visit(int,int);      //定义全局函数

 /*二维数组初始化(建立迷宫)*/
int maze[20][21] =
{
 {0,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
 {0,2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2},
 {0,2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 2},
 {0,2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 2},
 {0,2, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2},
 {0,2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2},
 {0,2, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 2},
 {0,2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2},
 {0,2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 2},
 {0,2, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2},
 {0,2, 2, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0, 2},
 {0,2, 2, 0, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2},
 {0,2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 2},
 {0,2, 0, 2, 2, 2, 0, 0, 0, 2, 0, 2, 0, 0, 2, 2, 2, 2, 0, 2, 2},
 {0,2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 0, 2},
 {0,2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 2, 2, 0, 2},
 {0,2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2},
 {0,2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2},
 {0,2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2},
 {0,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
};

/*核心算法*/
int startI = 1, startJ = 2; // 迷宫入口
int endI = 18, endJ = 19; // 迷宫出口 int success = 0;
int visit(int i, int j)   //此处 i,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;  //如果没有找到通路,那么,maze[i][j] = 0; 。即不打印脚迹,而打印 空房间
 return success; //返回主函数,让主函数判断是否打印脚迹
}
 
/*打印路径*/
void print()
{

 printf(“****************显示迷宫****************\n\n”);

 for(int i = 0; i < 20; i++)   //显示出迷宫(需要连续打印), 控制打印地i+1行迷宫  的语句
 {

  for(int j = 0; j < 21; j++)  //控制打印(第i+1行,第j+i列)迷宫  的语句
      if(i==1&&j==1)
     printf(“→”);  //第二行的第一格为进入迷宫的箭头(告诉别人从哪里进入)
      else if(i==18&&j==20)
        printf(“→”); //第十一行的最后一格为走出迷宫的箭头(告诉别人从哪里出去)
      else if(i==0&&j==1)
        printf(“进”);
      else if(i==19&&j==20)
        printf(“出”);         

   else if(maze[i][j]== 2)  //(数值为2时)打印出墙壁
    printf(“█”);
   else

    printf(”  “);   //(数值不为2并且不占用箭头格的)打印出空间
   printf(“\n”);

 }
 printf(“\n”);

 if(visit(startI,startJ) == 0)   //如果入口没有路通出口,那么就说“没找到出口!”
  printf(“\n没有找到出口!\n”);

 else                           //如果有路通出口,就打印出可通出口的一条路径
 {
  printf(“输入’y’显示路径,输入其他退出: “);
     a=getchar();
  if(a==’y’||a==’Y’)
  {printf(“\n\n******************显示路径****************\n\n”);
  for(int i = 0; i < 20; i++) //在整个迷宫找通路
  {
   for(int j = 0; j < 21; j++)
   {
      if(i==1&&j==1)
     printf(“→”);
      else if(i==18&&j==20)
        printf(“→”);
    else if(maze[i][j]== 2) printf(“█”);//打印初始化的墙壁

    else if(maze[i][j]==1) printf(“▽”);  //打印出能通到出口的脚印
    else
     printf(”  “);
   }
    printf(“\n”);

  }
  }
   else
  return ;
 }
 getchar();   //控制“老鼠出迷宫.EXE”可执行程序不是一执行就马上退出
 getchar();
}

int main(void)  //主函数开始执行
{
 print();//显示图案
 return 0;   //主函数为int型,需要有返回值
}

 

 

    原文作者:回溯法
    原文地址: https://blog.csdn.net/h302849781/article/details/23884493
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞