描述:
打印出迷宫图形,寻找迷宫路径,输入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型,需要有返回值
}