[回溯法] 大一课设-走迷宫-输出所有可能的路径(可修改每步时间,加以理解整个过程)

本文主要是介绍[回溯法] 大一课设-走迷宫-输出所有可能的路径(可修改每步时间,加以理解整个过程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大一时写的课设,今天翻到,在此保存。
若有帮到您最好,不足之处请多多包涵,欢迎指正错误。

【运行】
在这里插入图片描述
【最终结果】
在这里插入图片描述
【代码】

#include<stdio.h>
#include <stdlib.h>
#include<windows.h>// 可修改的参数
#define SLEEP_TIME 300 //每次的休息时间(单位毫秒),方便看递归过程,便于理解,设置成0直接看最后答案
#define N 10
#define MAN 5
#define WALL 1
#define EMPTY 0
int map[N][N] = { //地图{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},{1, 0, 1, 1, 1, 1, 1, 1, 0, 1},{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};// 方向
int dirs[4][2] = {{0, 1}, //右{1, 0}, //下{0, -1}, //左{-1, 0}	//上
};
int cnt=0; //当前路径数// UI
void gotoxy(int x, int y);
void Update();// 核心
void dfs(int si, int sj, int ei, int ej) { //开始的坐标si,sj;结束的坐标ei,ejint i;if (si<0 || si>=N || sj<0 || sj>=N) return ;if (map[si][sj]!=EMPTY) return ; //不是空路,退出map[si][sj] = MAN; //走到这一格printf("i=%d j=%d", si, sj);Update();if (si==ei && sj==ej) { //到达终点++cnt; //策略+1printf("\n");} else {// 4个方向继续走	for (i=0; i<4; ++i) {dfs(si+dirs[i][0], sj+dirs[i][1], ei, ej);}}map[si][sj] = EMPTY; //退出这一格Update();
}int main() {char tmp;printf("按任意键继续\n");scanf("%c", &tmp);Update();dfs(1, 1, 8, 8);printf("结束:一共有%d个方案\n", cnt);return 0;
}// 光标移动函数
void gotoxy(int x, int y) {COORD pos;pos.X = x; pos.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}// 更新屏幕
void Update() {int i, j;gotoxy(0, cnt*(N+2));Sleep(SLEEP_TIME);printf("---------- 方案%d ----------\n", cnt+1);for (i=0; i<N; ++i) {for (j=0; j<N; ++j) {if (map[i][j]==WALL) printf("*");else if (map[i][j]==EMPTY) printf(" ");else if (map[i][j]==MAN) printf("%c", 12);}printf("\n");}
}

这篇关于[回溯法] 大一课设-走迷宫-输出所有可能的路径(可修改每步时间,加以理解整个过程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705473

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

利用Python把路径转为绝对路径的方法

《利用Python把路径转为绝对路径的方法》在Python中,如果你有一个相对路径并且想将其转换为绝对路径,你可以使用Path对象的resolve()方法,Path是Python标准库pathlib中... 目录1. os.path.abspath 是什么?怎么用?基本用法2. os.path.abspat

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧

《Python函数的基本用法、返回值特性、全局变量修改及异常处理技巧》本文将通过实际代码示例,深入讲解Python函数的基本用法、返回值特性、全局变量修改以及异常处理技巧,感兴趣的朋友跟随小编一起看看... 目录一、python函数定义与调用1.1 基本函数定义1.2 函数调用二、函数返回值详解2.1 有返