首页 > 其他分享 >C语言数据结构---迷宫问题(栈)

C语言数据结构---迷宫问题(栈)

时间:2023-05-02 15:56:31浏览次数:32  
标签:return di int top C语言 --- base maze 数据结构

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define M 4
#define N 4
/*
迷宫--- 外围加上一圈 1
起点--0 0 1 1
0 0 0 0
0 1 1 1
0 0 0 0--出口
*/
//此迷宫按照优先向右下方向移动的标准!!!!

//要用链表形式的栈存放坐标+方向
typedef struct {
//存放坐标x,y 接下来的前进方向di
int x;
int y;
int di;
}Pos;

//定义一个栈
typedef struct {
Pos* top;
Pos* base;
}Stack;
//栈的初始化
int InitStack(Stack& s) {
s.base = new Pos[MAXSIZE];
s.top = s.base;
return 0;
}
//入栈
int Push(Stack& s,Pos n) {
if (s.top - s.base == MAXSIZE)
{
printf("栈满\n");
return 0;
}
else
{
*s.top++ = n;
}
return 0;
}
//出栈
int Pop(Stack& s, Pos& e) {
if (s.top == s.base )
{
printf("栈空\n");
return 0;
}
else
{
e = *--s.top;
}
return 0;
}
//从栈底输出栈
int printStack(Stack& s) {
Stack p;
//int i = 0;
p.base = s.base;
p.top = s.top;
while (p.base != p.top)
{
printf("(%d,%d)\n",p.base[0].x,p.base[0].y);
p.base++;
}
return 0;
}
//方向试探
typedef struct {
//x,y方向上的增量
int incX, incY;
}Direction;


//0 -3 依次表示向右 下 左 上 移动

Direction direction[4]{{0,1} ,{1,0},{0,-1},{-1,0} };


//栈中的数据元素
typedef struct {
//当前访问迷宫各自的横纵坐标
int x, y;
int di;//当前方向 di = 0 1 2 3

}Box;

//方法, 当到达某点(i,j)后,将对应的maze(i,j) 置为-1,其他未经过的点只能是1/0;
bool findPath(int maze[M + 2][N + 2], Direction direct[], Stack& s) {
Pos temp;
int x, y, di;//迷宫格子当前的纵横坐标和方向
int line, col;//迷宫下一组单元的行列坐标
maze[1][1] = -1;
temp = { 1,1,-1 };
//压栈
Push(s, temp);
while (s.base != s.top)
{
//出栈
Pop(s,temp);
x = temp.x;
y = temp.y;
di = temp.di + 1;
while (di < 4)
{
line = x + direct[di].incX;
col = y + direct[di].incY;
if (maze[line][col] == 0) {
temp = { x,y,di };
Push(s, temp);
//将走过的格子赋值为-1
x = line; y = col; maze[line][col] = -1;
if (x == M&&y == N )
{
printf("成功走出迷宫!\n");
//输出路线 + 出口
printStack(s);
printf("(4,4)\n");
return true;
}
else
{
di = 0;
}
}
else
{
di++;
}
}
}
return false;//迷宫没有出口
}
int main() {
//初始化栈
Stack s;
InitStack(s);
int inner[M][N] = { {0,0,1,1},{0,0,0,0},{0,1,1,1},{0,0,0,0} };
int maze[M + 2][N + 2];
// 初始化迷宫
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
maze[i + 1][j + 1] = inner[i][j];
}
}
for (int i = 0; i < M+2; i++)
{
maze[i][0] = 1;
maze[i][N+1] = 1;
}
for (int i = 0; i < N+2; i++)
{
maze[0][i] = 1;
maze[M + 1][i] = 1;
}
printf("迷宫为:\n");

for (int i = 0; i < M + 2; i++)
{
for (int j = 0; j < N + 2; j++) {
printf("%d\t", maze[i][j]);
};
printf("\n");
};
findPath(maze, direction, s);
return 0;
}

标签:return,di,int,top,C语言,---,base,maze,数据结构
From: https://www.cnblogs.com/afterschooltea/p/17367786.html

相关文章

  • 基础-函数-字符串函数
    A.concat:字符串拼接selectconcat('Hello','MySQL');B.lower:全部转小写selectlower('Hello');C.upper:全部转大写selectupper('Hello');lpad:左填充selectlpad('01',5,'-');rpad:右填充sel......
  • 11 ETH-反思
    《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click11ETH-反思目录11ETH-反思Issmartcontractreallysmart?只是代码合同。smartcontractisanythingbutsmart.不可篡改性,其实是一个双刃剑......
  • 基础-SQL-DCL-权限控制
    注意事项:•多个权限之间,使用逗号分隔•授权时,数据库名和表名可以使用*进行通配,代表所有。1).查询权限SHOWGRANTSFOR'用户名'@'主机名';2).授予权限GRANT权限列表ON数据库名.表名TO'用户名'@'主机名';3).撤销权限REVOKE权限列表ON数据库名.表名FR......
  • 12 ETH-美链
    《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click12ETH-美链目录12ETH-美链ICO(InitialCoinOffering)IPO(InitialPublicOffering)发布的代币没有自己的区块链,而是以智能合约的形式运行在以太坊的E......
  • c语言数据结构-----循环队列
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE10//循环队列长度为m-1时即为满typedefstruct{ intfront; intrear; int*base;}SqQueue;//初始化队列intInitQueue(SqQueue&q){ q.base=newint[MAXSIZE]; q.front=q.rear=0; return0;}//求队列长度int......
  • 基础-SQL-DCL-用户管理
    DCL英文全称是DataControlLanguage(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 其中Host代表当前用户访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯......
  • 08 ETH-权益证明
    08ETH-权益证明目录08ETH-权益证明比特币能耗随时间变化:TWh=Terawatthours$10^{12}$KWH=kilowatthours$10^3$具体电量的统计数据:一个交易1000多度电。以太坊统计数据:以太坊能耗具体数据:为什么比特币的能耗比以太坊大,实际比比特币低?以太坊出块时间短。......
  • 09 ETH-智能合约
    09ETH-智能合约目录09ETH-智能合约强类型语言solidity中的hash表不支持遍历。所以需要想办法来进行处理。如何调用智能合约?调用合约的方式:第一种:一个交易只能由外部账户发起,合约账户不能主动发起交易。第二种:第三种:转账金额可以不给,但是汽油费是必须给的,......
  • 10 ETH-TheDAO
    《区块链技术与应用》课程链接:https://www.bilibili.com/video/BV1Vt411X7JF/?spm_id_from=333.337.search-card.all.click10ETH-TheDAO目录10ETH-TheDAO重入攻击比特币——>去中心化货币以太坊——>去中心化合约DAO(DecentralizedAutonomousOrganization):TheDAO就......
  • VBA-选择标题的内容
    简单说明这个是模仿但是不是wod自带的功能:选择标题和内容 这个功能能方便的快速选择这个标题下面的所有内容。要选定是因为我要对这个标题下面的子标题进行排序,但是排序的话,不能有父标题,也就是说,选择的内容中的最高标题要是同级别(有父标题就排序父标题去了,但是父标题又只有一......