博客
关于我
C语言项目————1、迷宫问题求解
阅读量:161 次
发布时间:2019-02-28

本文共 2921 字,大约阅读时间需要 9 分钟。

无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,小白也能学,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家。点可以跳转到教程!

/*          迷宫问题求解          */#define ENDM 8  // 目标点横坐标#define ENDN 9  // 目标点纵坐标#define SM 1   //出发点横坐标#define SN 1   //出发点纵坐标#define ROW 10#define COL 11#include"stack.h"   //请一定要认真看看stack.h文件哦,它可能和你现在编的函数有些小差异。int dx[4]= {0, 1,  0, -1};  //方向定义,右0 下1 左2 上3  此处可根据出发点和目标点的不同而调整,使得路线尽量最短int dy[4]= {1, 0, -1,  0};  char MAP[10][11]= { //注意,地图的设置,四个边框一定要是封闭的哦,如果给你的地图不封闭,同学们有办法解决不?		{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},		{'#', ' ', ' ', '#', '#', ' ', ' ', ' ', ' ', '#', '#'},		{'#', ' ', '#', ' ', '#', '#', ' ', '#', ' ', '#', '#'},		{'#', ' ', '#', ' ', '#', '#', ' ', '#', ' ', ' ', '#'},		{'#', ' ', '#', ' ', ' ', '#', ' ', '#', '#', ' ', '#'},		{'#', ' ', '#', '#', ' ', '#', ' ', ' ', '#', ' ', '#'},		{'#', ' ', '#', ' ', ' ', ' ', '#', ' ', ' ', ' ', '#'},		{'#', ' ', '#', ' ', '#', ' ', '#', ' ', '#', ' ', '#'},		{'#', ' ', ' ', ' ', '#', ' ', ' ', ' ', '#', ' ', '#'},		{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}};int AA[10][11]={ //与MAP对应	   {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},	   {1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1},	   {1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1},	   {1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1},	   {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1},	   {1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1},	   {1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1},	   {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},	   {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1},	   {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},};int R(int u,int v)  //对于一个给定的坐标,如果该点越界或是障碍点,返回1,否则返回0{	if (u<0 || v<0)  		return 1;	if (u>9 || v>10)		return 1;	if (AA[u][v]==1)		return 1;		return 0;} int main() {   int i,j, k;   int u,v;   SqStack s;   InitStack(&s);  //初始化栈S       i=SM;  //i, j是当前点坐标,从出发点(SM, SN)开始   j=SN;   while (1)  //该while循环的程序逻辑,是严格按照流程图(流程图在哪里?请见王老师《算法设计与实现》课件之"讲义(不断更新中).ppt")来转换而成的   {	   AA[i][j]=1;  //当前点走过,所以标为1	   k=-1;  //之所以设置成-1,是为了和下面的k++呼应,让方向值k一开始从0开始。	   do  //体会什么叫“do while中嵌套一个while循环”	   {		   k++;		   while(k>=4) 		   {			   if (StackIsEmpty(s))  			   {				   printf("本迷宫无解。\n");				   DestroyStack(&s);				   return -1;			   }			   else  //如果栈内有点,那么就原路退回到刚走过来的那个点(旧点),并且重新刷新i,j,k的值			   {				   Pop(&s, &i, &j, &k);				   k++; //换下一个方向。 此处是“旧点新方向”			   }		   }		   u= i + dx[k];   //产生新的尝试点(u,v)		   v= j + dy[k];	   }while(AA[u][v]==1 || R(u,v)==1); //必须是没走过的点,而且是未越界的非障碍点	   	   if (u==ENDM && v== ENDN) //如果尝试点就是终点,那说明已经找到终点了,完整路径存放在此时的堆栈中。		{			Push(&s, i, j, k); //别忘了将当前点压栈,以方便等会下面的输出			Push(&s, u, v, 0); //别忘了将终点压栈,以方便等会下面的输出			/* 输出栈内结果*/			while (!StackIsEmpty(s))			{				Pop(&s, &i, &j, &k);				MAP[i][j]= '1';   //根据路径修改地图,走法标为"1"(当然,你可以改成其他数字符号),使得显示更直观好看			}			for (i=0; i<10; i++)  //输出迷宫和走法			{				for(j=0; j<11; j++)					printf("%c ", MAP[i][j]);				printf("\n");			}			DestroyStack(&s); //撤退之前别忘了打扫战场,退出之前一定要记得销毁顺序栈哦!			return 0;		}				Push(&s, i, j, k);  //如果尝试点不是终点,则将当前点和方向压栈,并“向前走(即修改当前点的值为(u,v) )”		i= u;		j=v;   }   }

转载地址:http://olwj.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>