数据结构--迷宫求解

这篇具有很好参考价值的文章主要介绍了数据结构--迷宫求解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

  • 一、问题的描述
  • 二、系统功能设计
  • 三、各个代码部分
  • 四、整体代码及其运行
  • 五、总结

前言

迷宫求解--C语言


一、问题描述

在一个迷宫中,需要我们找到出去的道路,并且得到的路经是最短的。

迷宫设置如下:迷宫使用标记(0,1,2,3分别代表迷宫的墙壁,通道,入口和出口)

从开始点出发,每个点采取四领域方法,按照上、下、左、右四个方向的顺序搜索下一个相邻的点,有路则进,无路则退,并从下一个方向继续搜索。

 

二、系统功能设计

需要功能设计的功能有:

  • 1、实现迷宫地图
  • 2、求出最短路径
  • 3、在迷宫中显示最短路径

 

三、各个代码部分

1、实现迷宫地图

1、主要以二维数组的方式来显示和存储

#include <stdio.h>
#include <stdlib.h>

int p,q,m,n,min=888;    //设置行数m 与列数 n   (p,q)为终点的坐标
int total = 0;		    //路径总数
int book[51][51];       //标记数组 用于判断下个坐标是否走过 走过则标记为1
int a[51][51];	        // 1表示空地 0表示障碍物
int path1[51],path2[51];//保存路径的x,y坐标

 2、在二维数组中输入迷宫,0代表障碍,1代表可通路。并且输入起点和终点的坐标。

//创建迷宫
void createload()
{
    int st,ed;
	int i,j;
	printf("-------------------开始创建迷宫-------------------\n");
	printf("请分别输入迷宫的行数和列数:");
	scanf("%d %d", &m, &n);
	printf("请输入迷宫,可走的路径设置为1 障碍物设置为0:\n");
	for (i=0; i <m; i++)
		for (j =0; j <n; j++)
			scanf("%d", &a[i][j]);

	printf("请输入起点坐标:\n");
	scanf("%d %d", &st, &ed);
	book[st][ed] = 1;

	printf("请输入终点坐标:\n");
	scanf("%d %d", &p, &q);
	printf("-------------------创建迷宫成功!-------------------\n");
	printf("最短路径如下:\n");
	printf("(%d,%d)",st,ed);
	dfs(st, ed, 0);
	printf("\n最短路径为%d\n",min);
	a[st][ed] = 2;
	a[p][q] = 3;
}

效果如下: 

 数据结构迷宫求解代码,数据结构,python,pandas,机器学习

2、求出最短路径 

 1、搜索方法有两种,一是深度优先搜索,二是广度优先搜索。

本系统使用的为深度优先搜索dfs

//深度优先搜素
void dfs(int x, int y, int step) {
    int i;
	if (x == p&& y == q)
	{
		total++;
		if (step < min){		//如果step比min小,就修改min的值
			min = step;
            for(i = 0; i < step; i++){
                printf("(%d,%d)",path1[i],path2[i]); //打印一维路径
                a[path1[i]][path2[i]] = 5;
            }
        }
		return;				//如果到达了终点就回溯
	}else {
		if ( y + 1 <= n && a[x][y+1] == 1 && book[x][y+1]==0)	//判断边界以及该坐标是否被标记和是否是空地
		{
			book[x][y+1] = 1;		// 递去阶段:当走到当前位置,标记已走过
            path1[step] = x; //缓存x
		   	path2[step] = y+1; //缓存y
			dfs(x , y+1, step + 1);	//	进行该位置的深度优先搜索
            book[x][y+1] = 0;	// 回溯阶段: 取消该标记,并按顺序继续移动
		}
		if ( x + 1 <= m && a[x+1][y] == 1 && book[x+1][y ] == 0)
		{
			book[x+1][y] = 1;
            path1[step] = x+1; //缓存x
		   	path2[step] = y; //缓存y
			dfs(x+1, y , step + 1);
			book[x+1][y] = 0;
		}
		if (0 < y -1  && a[x][y -1] == 1 && book[x][y - 1] == 0)
		{
			book[x][y -1] = 1;
            path1[step] = x; //缓存x
		   	path2[step] = y-1; //缓存y
			dfs(x, y - 1, step + 1);
			book[x][y - 1] = 0;
		}
		if (0 < x -1  && a[x - 1][y] == 1 && book[x -1][y] == 0)
		{
			book[x - 1][y] = 1;
            path1[step] = x-1; //缓存x
		   	path2[step] = y; //缓存y
			dfs(x -1, y, step + 1);
			book[x -1][y] = 0;
		}
		return;		//当无路可走时 回溯上一个位置;
	}
}

3、在迷宫中显示最短路经 

//显示迷宫路径
void printload()
{
    int i,j;
    printf("最短路径显示如下:\n");
	for (i=0; i <m; i++){
		for (j =0; j <n; j++){
			printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

 

四、整体代码及其整体运行 

1、所有代码如下:建议将子函数放在另一个文件里,与主函数区分开。 

#include <stdio.h>
#include <stdlib.h>

int p,q,m,n,min=888;    //设置行数m 与列数 n   (p,q)为终点的坐标
int total = 0;		    //路径总数
int book[51][51];       //标记数组 用于判断下个坐标是否走过 走过则标记为1
int a[51][51];	        // 1表示空地 0表示障碍物
int path1[51],path2[51];//保存路径的x,y坐标

void createload();//创建迷宫
void dfs(int x, int y, int step);//深度优先搜索迷宫
void printload();//显示迷宫最短路径

//创建迷宫
void createload()
{
    int st,ed;
	int i,j;
	printf("-------------------开始创建迷宫-------------------\n");
	printf("请分别输入迷宫的行数和列数:");
	scanf("%d %d", &m, &n);
	printf("请输入迷宫,可走的路径设置为1 障碍物设置为0:\n");
	for (i=0; i <m; i++)
		for (j =0; j <n; j++)
			scanf("%d", &a[i][j]);

	printf("请输入起点坐标:\n");
	scanf("%d %d", &st, &ed);
	book[st][ed] = 1;

	printf("请输入终点坐标:\n");
	scanf("%d %d", &p, &q);
	printf("-------------------创建迷宫成功!-------------------\n");
	printf("最短路径如下:\n");
	printf("(%d,%d)",st,ed);
	dfs(st, ed, 0);
	printf("\n最短路径为%d\n",min);
	a[st][ed] = 2;
	a[p][q] = 3;
}


//深度优先搜素
void dfs(int x, int y, int step) {
    int i;
	if (x == p&& y == q)
	{
		total++;
		if (step < min){		//如果step比min小,就修改min的值
			min = step;
            for(i = 0; i < step; i++){
                printf("(%d,%d)",path1[i],path2[i]); //打印一维路径
                a[path1[i]][path2[i]] = 5;
            }
        }
		return;				//如果到达了终点就回溯
	}else {
		if ( y + 1 <= n && a[x][y+1] == 1 && book[x][y+1]==0)	//判断边界以及该坐标是否被标记和是否是空地
		{
			book[x][y+1] = 1;		// 递去阶段:当走到当前位置,标记已走过
            path1[step] = x; //缓存x
		   	path2[step] = y+1; //缓存y
			dfs(x , y+1, step + 1);	//	进行该位置的深度优先搜索
            book[x][y+1] = 0;	// 回溯阶段: 取消该标记,并按顺序继续移动
		}
		if ( x + 1 <= m && a[x+1][y] == 1 && book[x+1][y ] == 0)
		{
			book[x+1][y] = 1;
            path1[step] = x+1; //缓存x
		   	path2[step] = y; //缓存y
			dfs(x+1, y , step + 1);
			book[x+1][y] = 0;
		}
		if (0 < y -1  && a[x][y -1] == 1 && book[x][y - 1] == 0)
		{
			book[x][y -1] = 1;
            path1[step] = x; //缓存x
		   	path2[step] = y-1; //缓存y
			dfs(x, y - 1, step + 1);
			book[x][y - 1] = 0;
		}
		if (0 < x -1  && a[x - 1][y] == 1 && book[x -1][y] == 0)
		{
			book[x - 1][y] = 1;
            path1[step] = x-1; //缓存x
		   	path2[step] = y; //缓存y
			dfs(x -1, y, step + 1);
			book[x -1][y] = 0;
		}
		return;		//当无路可走时 回溯上一个位置;
	}
}

//显示迷宫路径
void printload()
{
    int i,j;
    printf("最短路径显示如下:\n");
	for (i=0; i <m; i++){
		for (j =0; j <n; j++){
			printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}


int main()
{
    createload();
    printload();
	return 0;
}

 2、整体运行结果如下:  

数据结构迷宫求解代码,数据结构,python,pandas,机器学习

 

 五、总结

太多了不会?跟着我的代码敲,熟能生巧,一个一个模块去做,分治法大事化小。看着代码自己打一遍,能运行就是成功。文章来源地址https://www.toymoban.com/news/detail-558416.html

到了这里,关于数据结构--迷宫求解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据分析专栏之Python篇】五、pandas数据结构之Series

    大家好!本期跟大家分享的知识是 Pandas 数据结构—Series。 Series 是一种类似于一维数组的对象,由下面两部分组成: values :一组数据,ndarray 类型 index :数据索引 顾名思义 ,我们在创建 Series 对象时,需要传递一组数据,该数据大多数时候是可迭代对象。因此,下面三种创

    2024年02月14日
    浏览(43)
  • 数据结构-迷宫问题

    题目链接:迷宫问题 、 注意不能斜着走! (1)0为可以走,1不能走且只有唯一一条通路 (2)我们可以通过判断上下左右来确定路是否能通过,再设置如果走过的路就用 2 来标记,这样就不会走回头路了,如果有多条能通过,只选择一条路来走 (3)当我们遇到死胡同时,应

    2024年02月04日
    浏览(28)
  • 【C数据结构】迷宫问题

    前言: 本章记录作者学习中,遇到的两个比较有趣的问题,一个简单和一个较复杂的迷宫问题。     让我们先来看简单的:迷宫问题 它的具体要求: 输入描述: 输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的 1表示墙壁 , 0表示可以走的路 。

    2024年02月02日
    浏览(33)
  • 数据结构线性结构(二)6迷宫最短路径

       

    2024年02月08日
    浏览(24)
  • 【数据结构】迷宫问题实现(包含界面)

    🎈🎈 问题描述:假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),试设计并验证一下算法:找出一条入口通往出口的路径,或报告一个\\\"无法通过\\\"的信息。 具体需求如下: 用C语言实现顺序存储结构上队列的基本操作,然后利用该队列的基本操

    2024年02月04日
    浏览(29)
  • 数据结构——迷宫问题(顺序栈、C++)

     讲解: 一、采用二维数组和srand函数随机生成只有0和1的迷宫。 二、求解迷宫大概思路:先将入口处的坐标即方向d入栈,然后当栈不为空时,取出栈顶(即当前节点)的数据。遍历当前节点的四个方向,找到可行的下一个节点,并将其入栈;如没有可行的下一个节点,则将

    2024年02月13日
    浏览(23)
  • 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了, 想复制完整代码直接复制最下面的 ,想复制分布代码去看我博客园链接吧 《数据结构与算法分析》课程设计——迷宫问题 - 刷子zz - 博客园 一、  问题描述 问题中迷宫可用方阵[m,n]表示,0表示能通过

    2024年02月10日
    浏览(37)
  • 【数据结构】迷宫问题DFS非递归(c语言实现)

    本来之前写过一个推箱子,就想着写个迷宫游戏,因为想着推箱子游戏里面也有墙,也有玩家的移动,比推箱子简单的是还不用判断前面是否有箱子的情况,但是自己写的迷宫游戏如果自己随机生成的迷宫地图的话,不一定会有通路,他要学一个什么随机迷宫的生成,刚看完

    2024年02月08日
    浏览(28)
  • C数据结构与算法——队列 应用(C语言纯享版 迷宫)

    实验任务 (1) 掌握顺序循环队列及其C语言的表示; (2) 掌握入队、出队等基本算法的实现; (3) 掌握顺序循环队列的基本应用(求解迷宫通路)。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数; 编写main()函数并根据需要修改、补充相关的类型定义与函数,以实

    2024年02月15日
    浏览(36)
  • 08-pandas 入门-pandas的数据结构

    要使用pandas,你首先就得熟悉它的两个主要数据结构:Series和DataFrame。虽然它们并不能解决所有问题,但它们为大多数应用提供了一种可靠的、易于使用的基础。 Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包