数据结构—线性实习题目(二)5迷宫问题(栈)

news2024/11/22 10:23:50

迷宫问题(栈)

#include <iostream>​
#include <assert.h>
using namespace std;
 
int qi1, qi2;
int n;
int m1, p1;
int** Maze = NULL;
int** mark = NULL;
 
 
struct items
{
    int x, y, dir;
};
 
struct offsets {
    int a, b;
    char* dir;
};
 
const int stackIncreament = 20;
template <class T>
class SeqStack {
public:
    SeqStack(int sz = 50);
    ~SeqStack() { delete[] elements; }
    void Push(const T& x);
    bool Pop(T& x);
    bool getTop(T& x);
    bool IsEmpty() const { return (top == -1) ? true : false; }
    bool IsFull() const { return (top == maxSize - 1) ? true : false; }
    int getSize() const { return top + 1; }
    void MakeEmpty() { top = -1; }
    void print();
    //friend ostream& operator<<(ostream& os, SeqStack<T>& s) {}
private:
    T* elements;
    int top;
    int maxSize;
    void overflowProcess();
};
 
template <class T>
SeqStack<T>::SeqStack(int sz) : top(-1), maxSize(sz) {
    elements = new T[maxSize];
    assert(elements != NULL);
}
 
template <class T>
void SeqStack<T>::overflowProcess() {
    T* newArray = new T[maxSize + stackIncreament];
    if (newArray == NULL) {
        cerr << "存储分配失败!" << endl;
        exit(1);
    }
    for (int i = 0; i < top; i++) newArray[i] = elements[i];
    maxSize += stackIncreament;
    delete[] elements;
    elements = newArray;
}
 
template <class T>
void SeqStack<T>::Push(const T& x) {
    if (IsFull() == true) overflowProcess();
    elements[++top] = x;
}
 
template <class T>
bool SeqStack<T>::Pop(T& x) {
    if (IsEmpty() == true) return false;
    x = elements[top--];
    return true;
}
 
template <class T>
bool SeqStack<T>::getTop(T& x) {
    if (IsEmpty() == true) return false;
    x = elements[top];
    return true;
}
 
template <class T>
void SeqStack<T>::print() {
    items item;
    SeqStack<items> temp(n);
    while (this->IsEmpty() == false) {
        this->Pop(item);
        temp.Push(item);
    }
    while (temp.IsEmpty() == false) {
        temp.Pop(item);
        cout << item.y << " " << item.x << endl;
    }
}
 
offsets move1[4] = {
    {1,0,(char*)"N" },
    {0,-1,(char*)"W"},
    {-1,0,(char*)"S"},
        {0,1,(char*)"E"}
         };
 
void path(int m, int p) {
    int i, j, d, g, h;
    mark[qi1][qi2] = 1;
    SeqStack<items> st(m * p);
    items tmp;
    tmp.x = qi1;
    tmp.y = qi2;
    tmp.dir = 0;
    st.Push(tmp);
    while (st.IsEmpty() == false) {
        st.Pop(tmp);
        i = tmp.x;
        j = tmp.y;
        d = tmp.dir;
        while (d < 4) {
            g = i + move1[d].a;
            h = j + move1[d].b;
            if (g == m1 && h == p1) {
                st.print();
                cout << j << " " << i << endl;
                cout << p1 << " " << m1 << endl;
                return;
            }
            if (Maze[g][h] == 0 && mark[g][h] == 0) {
                mark[g][h] = 1;
                tmp.x = i;
                tmp.y = j;
                tmp.dir = d;
                st.Push(tmp);
                i = g; j = h; d = 0;   // 修改
            }
            else d++;
        }
    }
    cout << "no path in Maze" << endl;
}
int m = 0, p = 0;
int main() {
    int i, j, num;
    cin >> m >> p;
    n = m * p;
    int** arr = new int* [p];
    for (int i = 0; i < p; i++) {
        arr[i] = new int[m];
        for (int j = 0; j < m; j++) {
            cin >> num;
            if (num == 4) {
                m1 = i;
                p1 = j;
            }
            if (num == 3) {
                qi1 = i; qi2 = j;
                num = 0;
            }
            arr[i][j] = num;
        }
    }
    Maze = arr;
    int** arr2 = new int* [p];
    for (int i = 0; i < p; i++) {
        arr2[i] = new int[m];
        for (int j = 0; j < m; j++) {
            arr2[i][j] = 0;
        }
    }
    mark = arr2;
    path(m1, p1);
 
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1148294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SE 学习笔记(十八)—— 注解、动态代理

目录 1 注解1.1 注解概述1.2 自定义注解1.3 元注解1.4 注解解析1.5 注解应用于 junit 框架 2 动态代理2.1 问题引入2.2 动态代理实现 1 注解 1.1 注解概述 Java 注解&#xff08;Annotation&#xff09;又称Java标注&#xff0c;是JDK 5.0引入的一种注释机制&#xff0c;Java语…

Java 基于微信小程序的汉堡点餐系统的研究与实现

文章目录 1 简介2 相关技术介绍3 系统需求分析4 系统功能分析5 系统的详细设计与实现5.1 系统登录页面5.2 点餐系统后台首页页面5.3 商品信息管理页面5.4 会员管理页面5.5 购买信息管理页面5.6 小程序首页信息页面5.7 商品信息页面5.8 在线下单页面 6 推荐阅读 1 简介 基于微信…

笔记本电脑搜索不到wifi6 无线路由器信号

路由器更换成wifi6 无线路由器后&#xff0c;手机能搜索到这个无线信号&#xff0c;但是笔记本搜索不到这个无线信号&#xff0c;后网上搜索后发现是无线网卡驱动问题&#xff0c;很多无线网卡使用的是Intel芯片&#xff0c;Intel就此发布了公告&#xff0c;升级驱动就可以彻底…

【C】C语言文件操作

1.为什么使用文件 我们前面学习结构体时&#xff0c;写通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删除数据&#xff0c;此时数据是存放在内存中&#xff0c;当程序退出的时候&#xff0c;通讯录中的数据自然就不存在了&#xff0c;等下…

ZYNQ连载08-Lwip网络组件

ZYNQ连载08-Lwip网络组件 1. 添加Lwip包 2. Lwip配置 我这里关闭ipv6和dhcp。 3. tcp客户端 #include "include/my_tcp.h" #include "lwip/ip.h"#define THREAD_STACKSIZE 1024 #define SERVER_PORT 8000 #define SERVER_ADDR "192.168.3.190&qu…

SHCTF2023 山河CTF Reverse方向week2weenk3部分WP【详解】

文章目录 [WEEK3]ststst[WEEK2]not gcc[WEEK2]Run?润&#xff01;[WEEK2]Authurs_box[WEEK2]pycode [WEEK3]ststst 64 bit 的 ELF 文件 sub_400763点进去看看 mprotect &#xff0c;这个 这一题是SMC TEA的考察&#xff0c;我写过一篇关于 SMC学习网鼎杯jocker 可以使用id…

设计模式(单例模式、工厂模式及适配器模式、装饰器模式)

目录 0 、设计模式简介 一、单例模式 二、工厂模式 三、适配器模式 四、装饰器模式 0 、设计模式简介 设计模式可以分为以下三种: 创建型模式&#xff1a;用来描述 “如何创建对象”&#xff0c;它的主要特点是 “将对象的创建和使用分离”。包括单例、原型、工厂方法、…

LabVIEW开发安捷伦液相色谱Agilent 1100 HPLC

LabVIEW开发安捷伦液相色谱Agilent 1100 HPLC 液相色谱是在科研中常用的仪器&#xff0c;尤其是安捷伦等大品牌。这里对1100的使用进行介绍。 LabVIEW安捷伦1100系列驱动程序&#xff0c;用于控制1100系列的所有仪器。在LabVIEW中使用串行&#xff0c;GPIB或以太网接口。参考…

【java爬虫】公司半年报数据展示

前言 前面有一篇文章介绍了使用selenium获取上市公司半年报的方法&#xff0c;这篇文章就给这些数据写一个简单的前端展示页面 上一篇文章的链接在这里 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 首先来看一下整个页面的展示效果 前端页面采用vueeleme…

第89步 时间序列建模实战:时间序列融合模型

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍融合模型模型。 &#xff08;1&#xff09;数据源&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndro…

创建进程中的内核操作

fork 是一个系统调用&#xff0c;流程的最后会在 sys_call_table 中找到相应的系统调用 sys_fork。 _do_fork 里面做的第一件大事就是 copy_process&#xff0c;咱们前面讲过这个思想。如果所有数据结构都从头创建一份太麻烦了&#xff0c;还不如使用惯用“伎俩”&#xff0c;…

shell脚本中数组

分界点&#xff1a;以下内容需要更改&#xff0c;正常放假更改 数组&#xff1a; 数组的作用&#xff1a;可以一次性的定义多个变量&#xff0c;数组的长度是不限的 数组的元素类型&#xff1a;int string float. 就是形成变量池&#xff0c;可以随时的遍历和使用 数组的写…

c#方法中的参数

无参 //无参数直接调用即可MethodWithoutParameters();/// <summary>/// 没有参数的方法/// </summary>private void MethodWithoutParameters(){Debug.Log("没有参数的方法");}有参 //有一个参数MethodWithOneParameters("我是参数");/// <…

【算法|动态规划 | 01背包问题No.2】AcWing 423. 采药

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&a…

JDBC与MySql数据库

一、系统开发前的环境准备 1.下载Mysql 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 文件解压缩到本地 在此路径下新增my.ini文件以及新建data文件夹 编辑my.ini文件 配置环境变量 注意是编辑系统变量的Path 以管理员身份运行cmd 输入命令&#xff1a…

【Go】格式化字符串指令大全 Redis常用命令

【Go】格式化字符串指令大全 && Redis常用命令 原创&#xff1a;As.Kai 博客地址&#xff1a;https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助&#xff0c;点赞点赞点赞~ 目录 格式化格式化字符串指令大全%s 用于插入字符串%d 用于插入整数%f 用于插入浮点数…

Spring AOP源码解读

今天我们来分析Spring中AOP的源码&#xff0c;主要是关于SpringAOP是如何发挥作用的。 前期准备 首先我们需要有一个Spring AOP项目&#xff0c;添加好了SpringAOP的依赖。 <dependency><groupId>org.springframework</groupId><artifactId>spring-co…

项目基础配置

1、Spring整合MyBatis&#xff1a; 在子工程中加入所需要的依赖 准备jdbc.properties 创建spring的配置文件、整合spring和mybatis 在spring的配置文件中加载jdbc.properties 配置数据源 测试数据库连接 配置SqlSessionFactoryBean 装配数据源 指定XXXMapper.xml文件的位…

DVWA-SQL Injection SQL注入

概念 SQL注入&#xff0c;是指将特殊构造的恶意SQL语句插入Web表单的输入或页面请求的查询字符串中&#xff0c;从而欺骗后端Web服务器以执行该恶意SQL语句。 成功的 SQL 注入漏洞可以从数据库中读取敏感数据、修改数据库数据&#xff08;插入/更新/删除&#xff09;、对数据…

【已解决】VSCode运行C#控制台乱码显示

问题描述 如上图所示&#xff0c;最近在学习C#突然发现我在运行Hello World的时候出现这样的乱码情况。 分析原因 主要是因为VS Code 是UTF-8的编码格式&#xff0c;而我们的PC是Unicode编码&#xff0c;所以我们需要对其进行一个统一即可解决问题。那么知道这个的问题那就开…