迷宫求解--C语言
在一个迷宫中,需要我们找到出去的道路,并且得到的路经是最短的。
迷宫设置如下:迷宫使用标记(0,1,2,3分别代表迷宫的墙壁,通道,入口和出口)
从开始点出发,每个点采取四领域方法,按照上、下、左、右四个方向的顺序搜索下一个相邻的点,有路则进,无路则退,并从下一个方向继续搜索。
- 1、实现迷宫地图
- 2、求出最短路径
- 3、在迷宫中显示最短路径
1、主要以二维数组的方式来显示和存储
#include
#include
int p,q,m,n,min=888; //设置行数m 与列数 n (p,q)为终点的坐标
int total = 0; //路径总数
int book[51][51]; //标记数组 用于判断下个坐标是否走过 走过则标记为1
int a[51][51]; // 1表示空地 0表示障碍物
int path1[51],path2[51];//保存路径的x,y坐标
2、在二维数组中输入迷宫,0代表障碍,1代表可通路。并且输入起点和终点的坐标。
//创建迷宫
void createload()
{
int st,ed;
int i,j;
printf("-------------------开始创建迷宫-------------------\n");
printf("请分别输入迷宫的行数和列数:");
scanf("%d %d", &m, &n);
printf("请输入迷宫,可走的路径设置为1 障碍物设置为0:\n");
for (i=0; i
效果如下:
1、搜索方法有两种,一是深度优先搜索,二是广度优先搜索。
本系统使用的为深度优先搜索dfs
//深度优先搜素
void dfs(int x, int y, int step) {
int i;
if (x == p&& y == q)
{
total++;
if (step < min){ //如果step比min小,就修改min的值
min = step;
for(i = 0; i < step; i++){
printf("(%d,%d)",path1[i],path2[i]); //打印一维路径
a[path1[i]][path2[i]] = 5;
}
}
return; //如果到达了终点就回溯
}else {
if ( y + 1 <= n && a[x][y+1] == 1 && book[x][y+1]==0) //判断边界以及该坐标是否被标记和是否是空地
{
book[x][y+1] = 1; // 递去阶段:当走到当前位置,标记已走过
path1[step] = x; //缓存x
path2[step] = y+1; //缓存y
dfs(x , y+1, step + 1); // 进行该位置的深度优先搜索
book[x][y+1] = 0; // 回溯阶段: 取消该标记,并按顺序继续移动
}
if ( x + 1 <= m && a[x+1][y] == 1 && book[x+1][y ] == 0)
{
book[x+1][y] = 1;
path1[step] = x+1; //缓存x
path2[step] = y; //缓存y
dfs(x+1, y , step + 1);
book[x+1][y] = 0;
}
if (0 < y -1 && a[x][y -1] == 1 && book[x][y - 1] == 0)
{
book[x][y -1] = 1;
path1[step] = x; //缓存x
path2[step] = y-1; //缓存y
dfs(x, y - 1, step + 1);
book[x][y - 1] = 0;
}
if (0 < x -1 && a[x - 1][y] == 1 && book[x -1][y] == 0)
{
book[x - 1][y] = 1;
path1[step] = x-1; //缓存x
path2[step] = y; //缓存y
dfs(x -1, y, step + 1);
book[x -1][y] = 0;
}
return; //当无路可走时 回溯上一个位置;
}
}
//显示迷宫路径
void printload()
{
int i,j;
printf("最短路径显示如下:\n");
for (i=0; i
1、所有代码如下:建议将子函数放在另一个文件里,与主函数区分开。
#include
#include
int p,q,m,n,min=888; //设置行数m 与列数 n (p,q)为终点的坐标
int total = 0; //路径总数
int book[51][51]; //标记数组 用于判断下个坐标是否走过 走过则标记为1
int a[51][51]; // 1表示空地 0表示障碍物
int path1[51],path2[51];//保存路径的x,y坐标
void createload();//创建迷宫
void dfs(int x, int y, int step);//深度优先搜索迷宫
void printload();//显示迷宫最短路径
//创建迷宫
void createload()
{
int st,ed;
int i,j;
printf("-------------------开始创建迷宫-------------------\n");
printf("请分别输入迷宫的行数和列数:");
scanf("%d %d", &m, &n);
printf("请输入迷宫,可走的路径设置为1 障碍物设置为0:\n");
for (i=0; i
2、整体运行结果如下:
太多了不会?跟着我的代码敲,熟能生巧,一个一个模块去做,分治法大事化小。看着代码自己打一遍,能运行就是成功。