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

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

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

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

#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

相关文章

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使