dfs可视化走迷宫过程

现在是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++~~~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值