现在是21:26,距离开始写这一道作业题目已经整整过去了两个小时(八点开始复习英语期中考试的计划彻底泡汤,明天考试直接gg)不得不说感冒的人智商真的快没有了,简简单单的dfs能写的如此艰难qaq,这里只能说建议大家身体不舒服的时候最好别打代码,尤其是dfs这样的,但凡没写对调试起来真的裂开555
然后就是痛斥dfs痛斥dfs痛斥dfs!!!!!调试太痛苦了5555555,但凡是个bfs调试起来应该都会舒服不少唉
抱怨结束qaq。这道作业题目是要先用c语言中的指针实现模拟按引用传递字符数组,用函数mazeGenerator随机生成迷宫,随后将这个迷宫传给函数mazeTraverse来dfs走出迷宫,并且要求每一步更新后都要输出当前迷宫的状态,从而可视化走出迷宫的过程。
代码难度肯定是在dfs段,但其实也只是对初学者而言,dfs过程只需要明确结束判断(何时return),边界判断(不出迷宫),book数组标记(不要忘了这个点搜完重置book数组值)等等,其实算法思维非常简单(所以调试起来看真实过程就非常麻烦了55555),此外就是一个方向数组来走迷宫。
然后就没有然后了,这段dfs写了20min,调了1h50min,喝了不知道多少水来压着自己的头晕,真的这辈子都不想调dfs的程序了(主要是还得自己先看随机生成的迷宫再一步步看dfs再怎么呆到不行的一步步搜索,真的恶心qaq)但是dfs还是很重要的hhh,在这里抱怨也就口嗨一下,以后该打dfs还是得打~~~上代码叭
Code:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
int nx[4] = { 0,-1,0,1 }, ny[4] = { 1,0,-1,0 };//方向数组方便移动
int book[12][12];//book数组标记每一个点是否走过
int ans;//用于判断能否走出
void mazeGenerator(char (*map)[12], int sx, int sy, int ex, int ey)//利用数组指针模拟按引用传递
{
printf("开始随机生成地图咯!\n");
srand(time(NULL));//生成随机数种子
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
if (i == sx && j == sy)//起点标志
map[i][j] = 'X';
else if (i == ex && j == ey)//终点标志
map[i][j] = '$';
else
{
int k;
k = rand()%2;//k随机生成0和1中的某个数
if (k)
map[i][j] = '.';
else
map[i][j] = '#';
}
}
}
return;
}
void print(char map[12][12])//打印地图的函数
{
printf("现在地图的状态是:\n");
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
{
printf("%c ", map[i][j]);
}
printf("\n");
}
return;
}
void mazetraverse(char map[][12], int sx, int sy,int ex,int ey)
{
if (sx==ex && sy==ey)//结束判断条件,已经走到了终点
{
print(map);//打印状态
printf("成功走出迷宫啦!");
ans = 1;
return;
}
int flag = 0;//用于判断该点周围还能不能继续走
print(map);//打印状态
for (int i = 0; i < 4; i++)
{
int nex = sx+nx[i], ney = sy+ny[i];//下一个位置的坐标
if (nex < 0 || nex>11 || ney < 0 || ney>11)//防止越界走出迷宫
continue;
if (!book[nex][ney] && map[nex][ney] != '#')//下一个位置没走过且可以走
{
flag = 1;
book[nex][ney] = 1;
map[sx][sy] = '.';//上一个位置的地图恢复成'.'
map[nex][ney] = 'X';//现在的位置变成X
printf("要走下一步啦!\n");
mazetraverse(map, nex, ney,ex,ey);//搜索下一个位置
if (ans==1)//若已经找到出口,直接return
return;
book[nex][ney] = 0;//book数组恢复没有走过的状态
map[nex][ney] = '.';//map数组也恢复
map[sx][sy] = 'X';
}
}
if (ans==1)//已经找到出口,函数结束
return;
if (!flag)//该点已经没法继续往下走了
{
printf("这个点不能继续走了......\n");
return;
}
return;
}
int main(){
int sx, sy, ex, ey;
printf("欢迎进入12X12的迷宫,请输入起始坐标和结束坐标,输入的数字应在0-11之间:\n");
printf("起始坐标为:");
scanf("%d%d", &sx, &sy);
printf("\n结束坐标为:");
scanf("%d%d", &ex, &ey);
char map[12][12];
char(*p)[12];//数组指针指向map
p = map;
mazeGenerator(p, sx, sy, ex, ey);
printf("初始迷宫是这样的:\n");
for (int i = 0; i < 12; i++)
{
for (int j = 0; j < 12; j++)
printf("%c ", map[i][j]);//打印初始的地图
printf("\n");
}
printf("开始走迷宫了哦!\n");
book[sx][sy] = 1;//起点已经走过了
mazetraverse(map, sx, sy,ex,ey);
if (ans == 0)
printf("走不出迷宫了......");
return 0;
}
希望今天的倒霉换来明天考试rp++~~~