c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>

迷宫问题 C语言实现 若当前位置“可通“,则纳入”当前路径”,并继续朝“下一个位置探索”,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。在迷宫的某一位置的下一个位置可能在其的几个方向上(最多四个)如果迷宫中存在入口到出口的通道,求的一条放入栈S中。将不能通过的位置设置为-1。 阅读详情

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>

//题目:栈解迷宫

//---------头文件---------

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

//---------宏定义---------

#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//------替换和结构体-------

typedef int Status;
typedef struct 
{
	int x;
	int y;
	int attribute;
}seat;
typedef struct
{
	int height;
	int width;
	seat *wall;
}maze;
typedef struct
{
	seat NowPosition;
	int id;
}Block;
typedef struct
{
	Block *base;
	Block *top;
	int stacksize;
}SqStack;

//------全局变量------

maze ma,*m=&ma;

//-------函数---------

int ComputerMazeStep(maze *m,seat start,seat end);
void CreatDigitalMap(maze *m);
void CreatInerfaceMap(maze *m);
void CreatInerfaceMapAgain(maze *m);
Status InitMap(maze *m);
Status InitStack(SqStack *s);
void InputAddStartAndEnd(seat *start,seat *end);
int JudgeThrough(maze *m,Block foot);
void MakeNoThroughSign(maze *m,Block foot);
void MakeThroughSign(maze *m,Block foot);
void NextStep(Block *foot,int id);
Status Pop(SqStack *s,Block *foot);
Status Push(SqStack *s,Block foot);
int VisitMap(maze *m,int x,int y);

//-----主函数-----

void main()
{
	seat start,end;
	CreatDigitalMap(m);
	CreatInerfaceMap(m);
	InputAddStartAndEnd(&start,&end);
	if(ComputerMazeStep(m,start,end))
	{
		CreatInerfaceMapAgain(m);
	}
	else
	{
		printf("此迷宫没有通路的求解.\n");
	}
	getchar();
	getchar();
}

//-------其它函数--------

int ComputerMazeStep(maze *m,seat start,seat end)
{
	int flag=1;
	SqStack sq,*s=&sq;
	Block foot,blockfoot;
	InitStack(s);
	foot.id=1;
	foot.NowPosition.x=start.x;
	foot.NowPosition.y=start.y;
	Push(s,foot);
	MakeThroughSign(m,foot);
	while(!(s->base==s->top))
	{
		blockfoot.NowPosition=foot.NowPosition;
		NextStep(&foot,foot.id);
		if(foot.id<5)
		{
			if(JudgeThrough(m,foot))
			{
				MakeThroughSign(m,foot);
				Push(s,foot);
				foot.id=1;
			}
			else
			{
				foot.NowPosition=blockfoot.NowPosition;
				foot.id++;
			}
		}
		else
		{
			MakeNoThroughSign(m,foot);
			Pop(s,&foot);
		}
		if(foot.NowPosition.x==end.x&&foot.NowPosition.y==end.y)
		{
			flag=0;
			break;
		}
	}
	if(0==flag)
	{
		return TRUE;
	}
	else
	{
		return ERROR;
	}
}

Status InitStack(SqStack *s)
{
	if(!(s->base=(Block*)malloc(m->height*m->width*sizeof(Block))))
	{
		exit(OVERFLOW);
	}
	s->top=s->base;
	s->stacksize=m->height*m->width;
	return TRUE;
}

Status Push(SqStack *s,Block foot)
{
	*(s->top++)=foot;
	return TRUE;
}

Status Pop(SqStack *s,Block *foot)
{
	if(s->base==s->top)
	{
		return ERROR;
	}
	*foot=*(--s->top);
}

Status InitMap(maze *m)
{
	printf("输入地图的长:");
	do
	{
		scanf("%d",&m->height);
		if(m->height<=0)
		{
			printf("输入无效,重新输入有效数据.\n");
			printf("输入地图的长:");
		}
	}while(m->height<=0);
	printf("输入地图的宽:");
	do
	{
		scanf("%d",&m->width);
		if(m->width<=0)
		{
			printf("输入无效,重新输入有效数据.\n");
			printf("输入地图的宽:");
		}
	}while(m->width<=0);
	if(!(m->wall=(seat*)malloc(m->height*m->width*sizeof(seat))))
	{
		exit(OVERFLOW);
	}
	return TRUE;
}

int VisitMap(maze *m,int x,int y)
{
	int i=0;
	for(;i<m->height*m->width;i++)
	{
		if(x==m->wall[i].x&&y==m->wall[i].y)
		{
			return i;
		}
	}
	return -1;
}

void CreatInerfaceMap(maze *m)
{
	int i=0;
	for(;i<m->height*m->width;i++)
	{
		if(0==m->wall[i].attribute)
		{
			printf("□");
		}
		else
		{
			printf("■");
		}
		if(0==(i+1)%m->height)
		{
			printf("\n");
		}
	}
}

void NextStep(Block *foot,int id)
{
	switch(id)
	{
	   case 1:foot->NowPosition.x++;break;
	   case 2:foot->NowPosition.y++;break;
	   case 3:foot->NowPosition.x--;break;
	   case 4:foot->NowPosition.y--;break;
	}
}

int JudgeThrough(maze *m,Block foot)
{
	int i;
	if(-1!=(i=VisitMap(m,foot.NowPosition.x,foot.NowPosition.y)))
	{
		if(0==m->wall[i].attribute)
		{
			return TRUE;
		}
		else
		{
			return ERROR;
		}
	}
	return ERROR;
}

void CreatDigitalMap(maze *m)
{
	int i,j=0,k=0,x,y;
	InitMap(m);
	for(i=0;i<m->height*m->width;i++)
	{
		m->wall[i].y=j++;
		m->wall[i].x=k;
		m->wall[i].attribute=0;
		if(0==j%m->height)
		{
			j=0;
			k++;
		}
	}
	printf("请输入墙壁的坐标,以(-1,-1)的格式结束\n");
	do
	{
		do
		{
			printf("墙壁坐标输入(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
			scanf("%d%d",&x,&y);
			if((x<0||x>m->height-1)&&(y<0||y>m->width-1)&&(-1!=x&&-1!=y))
			{
				printf("输入有误,超过地图界限,请重新输入坐标.\n");
			}
		}while((x<0||x>m->height-1)&&(y<0||y>m->width-1)&&(-1!=x&&-1!=y));
		if(-1!=(i=VisitMap(m,x,y)))
		{
			m->wall[i].attribute=1;
		}
	}while(-1!=x&&-1!=y);
}

void MakeThroughSign(maze *m,Block foot)
{
	int i;
	if(-1!=(i=VisitMap(m,foot.NowPosition.x,foot.NowPosition.y)))
	{
		m->wall[i].attribute=2;
	}
}

void MakeNoThroughSign(maze *m,Block foot)
{
	int i;
	if(-1!=(i=VisitMap(m,foot.NowPosition.x,foot.NowPosition.y)))
	{
		m->wall[i].attribute=3;
	}
}

void InputAddStartAndEnd(seat *start,seat *end)
{
	int i;
	printf("输入入口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
	do
	{
		scanf("%d%d",&start->x,&start->y);
		if((start->x<0||start->x>m->height-1)&&(start->y<0||start->y>m->width-1))
		{
			printf("输入有误,超过地图界限,请重新输入坐标.\n");
			printf("输入入口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
		}
		if(-1!=(i=(VisitMap(m,start->x,start->y))))
		{
			if(1==m->wall[i].attribute)
			{
				printf("该入口地址已经为墙壁,请重新输入起始坐标.\n");
				printf("输入入口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
			}
		}
	}while((start->x<0||start->x>m->height-1)&&(start->y<0||start->y>m->width-1)&&1==m->wall[i].attribute);
	printf("输入出口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
	do
	{
		scanf("%d%d",&end->x,&end->y);
		if((end->x<0||end->x>m->height-1)&&(end->y<0||end->y>m->width-1))
		{
			printf("输入有误,超过地图界限,请重新输入坐标.\n");
			printf("输入出口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
		}
		if(end->x==start->x&&end->y==start->y)
		{
			printf("入口地址和出口地址重合,请重新输入坐标.\n");
			printf("输入出口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
		}
		if(-1!=(i=(VisitMap(m,end->x,end->y))))
		{
			if(1==m->wall[i].attribute)
			{
				printf("该出口地址已经为墙壁,请重新输入起始坐标.\n");
				printf("输入出口地址(0<=x<=%d,0<=y<=%d):",m->height-1,m->width-1);
			}
		}
	}while((start->x<0||start->x>m->height-1)&&(start->y<0||start->y>m->width-1)&&1==m->wall[i].attribute&&(end->x==start->x&&end->y==start->y));
}

void CreatInerfaceMapAgain(maze *m)
{
	int i=0;
	for(;i<m->height*m->width;i++)
	{
		if(1==m->wall[i].attribute)
		{
			printf("■");
		}
		else if(2==m->wall[i].attribute)
		{
			printf("⊙");
		}
		else
		{
			printf("□");
		}
		if(0==(i+1)%m->height)
		{
			printf("\n");
		}
	}
}


 

c语言实现栈 阅读详情

相关推荐

C语言 栈 数据结构 迷宫求解(附完整代码)

一、程序设计思路 1、题目:应用栈实现迷宫游戏 要求:以书中3.2.4节迷宫求解为基础实现迷宫游戏,游戏运行时显示一个迷宫地图(迷宫内容结构可以参照书中图片,也可以自己编写),玩家从地图左上角的入口处进入迷宫,从右下角出口离开迷宫。玩家不能穿墙而过。本题目需在作业中完成程序设计思路、程序源代码和游戏视频三部分。其中,程序设计思路部分以文字叙述为主,详细阐述迷宫和玩家在迷宫中移动的基本操作;程序源代...

weixin_43401438的博客 2万+

c语言数据结构迷宫算法,c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>...

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫//题目:栈解迷宫//---------头文件---------#include#include//---------宏定义---------#define TRUE 1#define ERROR 0#define OVERFLOW -2//------替换和结构体-------typedef int Status;typedef str...

weixin_42357916的博客 265

栈应用之简单迷宫问题(C语言版)

迷宫在这儿——–&amp;gt;(用二维数组实现) 栈的应用有很多,前面解决了括号问题和后缀表达式问题,迷宫便可以解决了!! 迷宫的解题思路有点绕,并且其栈的结构也有所改变!但是本次解决迷宫仍然用的普通的栈 首先:迷宫如下(1表示通路,0表示非通路) 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 ...

Code_ZX的博客 7790

迷宫的实现--c语言

#include #include #include #define M 20 #define N 20 #define visited 2 #define TRUE 1 #define FALSE 0 #define INITSIZE 100 typedef int Status; typedef struct{       //坐标点结构体  int y;

学为心智 1015

数据结构:栈和队列-迷宫问题求解

//--------------------文件名:Maze.cpp------------------------//----------------------By SunxySong-------------------------//说明:本程序以迷宫问题进行演示,了解栈和链表的数据结构.//运行过程:随机生成迷宫地图(由于未详细设计算法,故地图较简单),//         并演示找到出

sunxysong的专栏 7387

随机迷宫生成

随机迷宫的生成,包含了栈等一系列C知识,非常适合初学者学习。

C语言学习(十二)栈和队列

栈 栈是一个特殊的线性表,只能在一端操作; 栈顶(top):允许操作 的一端; 栈底(bottom):不允许操作的一端 1.栈:是限定仅在表尾进行插入和删除操作的线性表;又称后进先出的线性表。LIFO结构。       栈顶top:允许插入和删除的一端;       栈底bottom:另外一端; 2. 空栈:不含任何数据元素的栈;top=-1; 3. 栈的操作:     进...

ls_dashang的博客 714

C语言使用队列和栈实现自动生成和求解迷宫

C语言使用队列和栈实现自动生成和求解迷宫

C语言实现迷宫求解问题(详细思路+附源代码)

二、数据结构 1) 建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁); 2) 创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。 1) 创建一个Int类型的二维数组intmaze[n1][n2],用来存放0和1 ; 2) 创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C) typedef struct node

好儿郎~志在四方 11万+

数据结构--迷宫实现

数据结构 栈实现迷宫问题 基础:C语言指针、链表思想的构建

勇闯迷宫(数据结构实践教程)

这是一个用数据结构编的小程序,不知您修改后能否可以将其变为一个小游戏?

队列实现求迷宫最短路径(包含每一步的尝试状态,迷宫随机生成)

#include #include #include #define Maxsize 50 int mg[10][10]; void shengcheng() { for(int i=0; i<10; i++) { mg[i][0]=1; mg[i][9]=1; mg[0][i]=1; mg[9][i]=1;

蜕变中的Programmer 5436

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4113

【记录】2种随机迷宫生成算法的cpp实现

1.DFS dfs(x,y) 标记(x,y) 若(x,y)存在未标记的相邻位置 从中随机选择一个(nx,ny) 联通(x,y)和这个位置 dfs(nx,ny) 若(x,y)所有相邻位置都被标记 返回 2.递归分割 dv(xa,ya,xb,yb) /(xa,ya)为当前区域的左上角,

Blackkitty 's Blog 6725

频谱分析常见坑:STM32的ADC采样+FFT处理时如何避免这5个错误

本文深入剖析了在STM32平台上进行ADC采样与FFT频谱分析时,工程师最常遇到的五个关键错误与性能陷阱。内容涵盖从采样频率设置、频谱泄露处理、ADC配置优化,到谐波识别校准及系统实时性设计,提供了详尽的避坑指南与实战调优策略,旨在帮助开发者构建稳定、精确的嵌入式频谱分析或波形识别系统。

7up55的博客 624

【SWAT水文模型】SWAT-CUP参数率定与模型验证实战指南

本文提供了SWAT水文模型参数率定与模型验证的完整实战指南。详细介绍了如何使用SWAT-CUP工具,特别是SUFI-2算法,进行自动化参数校准,并阐述了模型验证的关键步骤以避免过度拟合。内容涵盖从工程搭建、核心参数选择、迭代优化到结果分析与常见问题排查的全流程,旨在帮助用户提升SWAT模型模拟的准确性与可靠性。

weixin_29072299的博客 500

随机迷宫生成算法浅析

  摘要   本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法。最终的算法结合了图的深度优先遍历。通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳。   关键词:随机地图生成(random maze generating)、深度优先遍历(depth-first search) 1. 引言   在平常的游戏中,我们常常会碰到随机生成的地

天地会 1859

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3358

C语言 迷宫(栈实现)

Problem I:**迷宫(全部代码自己编写) Description  编写一个程序求解迷宫问题。迷宫是一个n行m列的矩阵,其中'0'表示无障碍,'1'表示有障碍。设入口为(1,1),出口为(n,m),每次移动只能从一个无障碍的单元移到其周围4个方向上任一无障碍的单元。若该迷宫存在一条从入口到出口的路径,则输出"yes";否则输出"no"。  算法可参考课本50页

u013545389的专栏 4854

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」

SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「4.1·经典AutoSAR下的SOME/IP架构」1 CP的SOME/IP架构概览2 业务报文通信流3 服务发现通信和控制流 1 CP的SOME/IP架构概览 2 业务报文通信流 3 服务发现通信和控制流 点击返回雪云飞星的SOME/IP协议详解「总目录」 ...

雪云飞星的博客 6070

AUTOSAR进阶图解==>AUTOSAR_EXP_CDDDesignAndIntegrationGuideline

本文档提供了AUTOSAR架构中复杂驱动(CDD)的设计与集成指南。CDD作为非标准化的软件实体,位于复杂驱动层,实现传感器评估、执行器控制、微控制器访问等特殊功能。文档详细阐述了CDD的架构特点、设计建议(包括文档要求、文件结构、接口描述等)以及与其他模块(RTE、库、标准BSW等)的集成方式。特别强调了CDD在多核系统和MCAL层中的实现考量,为开发人员提供了从文档规范到代码实现的全方位指导,确保CDD在保持AUTOSAR兼容性的同时满足特殊功能需求。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1890

中缀表达式转换为后缀表达式

从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理。 运算数:直接输出; 左括号:压入栈; 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出); 运算符: 若优先级大于栈顶运算符时,则把它压栈; 若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈。 若各对象处...

weixin_30362801的博客 344

基于matlab的图像HOG特征提取算法仿真

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 730

C/C++利用栈实现随机生成简单迷宫

上一篇文章中迷宫是基于程序员自身对于迷宫障碍物的构建而实现,具有主观因素,那么本篇文章基于srand((unsigned)time(NULL))函数来随机生成迷宫大小、障碍物坐标、出口坐标以及入口坐标,更加灵活。本文围墙的范围为[3,25],但由于随机生成的迷宫存在偶然性,因此尺寸较大的迷宫出现通路的概率反而较小,所以往往运行结果显示出的迷宫尺寸较小。本文使用的IDE是VS 2015,由于...

学IT的星同学 3265

二、TCP/IP协议之网络层(IP地址的格式、分类、报文格式)

数据报每经过一个路由器,路由器都要重新计算一下首部检验和,若首部未发生变化,则此结果必为 0,于是就保留这个数据报。对于网络号相的设备,无论实际所处的物理位置如何,它们都是处在同一个网络中。在首部的固定部分的后面是一些可选字段,其长度是可变的。IPv4 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。表示数据报在网络中的寿命,英文缩写是 TTL(Time To Live),功能是“跳数限制”。地址的网络号码字段用来标识一个网络,网络号码字段的前几位用来区分。

锦慈的技术博客 185

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表
下一篇: c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
utral董东东
博客等级 码龄16年 158粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值