ZISUOJ 数据结构--队列及其应用

说明:

        基本都是bfs的常见模板题型,思路都很直接,不过后面有两道题很搞心态,它们给的坐标x、y是反的,导致刚开始一直错。题目还是要看仔细,不能先入为主。

题目列表:

问题 A: 围圈报数(完善程序) 

参考题解:

#include<iostream>
#include<queue>
using namespace std;
int n,m,k=1,tmp;
queue<int> arr;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        arr.push(i);
        // _____(1)____//依次进入队列
        while(arr.size())
        // while(_____(2)_____)//判断队列里是否还有人
        {
            tmp=arr.front();
            if(k%m==0)
                cout<<tmp<<" ";
            else
                arr.push(tmp);
                // ______(3)______//如果不是第m个人,则重新入队
            // _____(4)_____//从队列里删除
            arr.pop();
            k++;
        }
    return 0;
}

问题 B: 围圈报数

参考题解:

#include <iostream>
#include <queue>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n,m,count = 0;cin >> n >> m;
    std::queue<int> q;
    for(int i = 1;i<=n;i++) q.push(i);
    while(q.size()){
        auto t = q.front();
        count++;
        if(count%m==0) {
            cout << t << ' ';
        }else {
            q.push(t);
        }
        q.pop();
    }
    cout << std::endl;
    return 0;
}

问题 C: 报数相同次数circle

参考题解:

#include <iostream>
#include <queue>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;cin >> n;
    int a,b;cin >> a >> b;
    std::queue<int> q1,q2;
    for(int i = 1;i<=a;i++) q1.push(i);
    for(int i = 1;i<=b;i++) q2.push(i);
    int count = 0;
    for(int i = 1;i<=n;i++) {
        auto t1 = q1.front(),t2 = q2.front();
        if(t1==t2) count++;
        q1.push(t1),q2.push(t2);
        q1.pop(),q2.pop();
    }
    cout << count << std::endl;
    return 0;
}

问题 D: 最小倍数

参考题解:

#include <iostream>
#include <queue>
using std::cin;
using std::cout;
using ll = long long;
ll n,x;
void bfs() {
    std::queue<ll> q;
    q.push(1);
    while(q.size()) {
        x = q.front();q.pop();
        if(x%n==0&&x>=n) {
            cout << x << '\n';
            return;
        }
        q.push(x*10);
        q.push(x*10+1);
    }
    cout << x << '\n';
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    while(cin >> n,n) {
        bfs();
    }
    return 0;
}

问题 E: 迷宫的最短路径

参考题解:

#include <iostream>
#include <queue>
#include <cstring>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e2+5;
    int sx = 1,sy = 1,ex = 1,ey = 1;
    struct node {
        int x,y,s;
    }t,t1;
    char g[N][N];
    bool vis[N][N];
    memset(vis,false,sizeof vis);
    int dx[] = {0,0,-1,1};
    int dy[] = {-1,1,0,0};
    std::queue<node> q;
    int n,m;cin >> n >> m;
    for(int i = 1;i<=n;i++) {
        for(int j = 1;j<=m;j++) {
            cin >> g[i][j];
            if(g[i][j]=='S') {
                sx=i,sy=j;
            }else if(g[i][j]=='G') {
                ex=i,ey=j;
            }
        }
    }
    auto bfs = [&]()->void{
        t.x = sx,t.y = sy,t.s = 0;
        q.push(t);
        vis[sx][sy] = true;
        while(!q.empty()) {
            t = q.front();q.pop();
            if(t.x==ex&&t.y==ey) {
                cout << "The min steps are:" << t.s << "!\n";
                return;
            }
            for(int i = 0;i<4;i++) {
                int u = t.x+dx[i],v = t.y+dy[i];
                if(u<1||u>n||v<1||v>m||vis[u][v]||g[u][v]=='#') continue;
                vis[u][v] = true;
                t1.x = u,t1.y = v,t1.s = t.s+1;
                q.push(t1);
            }
        }
        cout << "sorry!\n";
    };
    bfs();
    return 0;
}

问题 F: 象棋中的马之进阶

参考题解:

#include <iostream>
#include <queue>
#include <cstring>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 15;
    struct node {
        int x,y,s;
    }t,t1;
    int dx[] = {-1,1,2,2,1,-1,-2,-2};
    int dy[] = {2,2,1,-1,-2,-2,-1,1};
    int sx,sy,ex,ey;
    bool vis[N][N];
    memset(vis,false,sizeof vis);
    cin >> sy >> sx >> ey >> ex;
    std::queue<node> q;
    auto bfs = [&]() ->void {
        t.x = sx,t.y = sy,t.s = 0;
        vis[sx][sy] = true;
        q.push(t);
        while(!q.empty()) {
            t = q.front();q.pop();
            if(t.x==ex&&t.y==ey) {
                cout << t.s << std::endl;
                return;
            }
            for(int i = 0;i<8;i++) {
                int u = t.x+dx[i],v = t.y+dy[i];
                if(u<1||u>10||v<1||v>9||vis[u][v]) continue;
                vis[u][v] = true;
                t1.x = u,t1.y = v,t1.s = t.s+1;
                q.push(t1);
            }
        }
        cout << 0 << std::endl;
    };
    bfs();
    return 0;
}

 

问题 G: 迷宫探险

参考题解:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e2+5;
    struct node {
        int x,y,s;
        bool operator > (const node &W) const {
            return s > W.s;
        }
    }t,t1;
    char g[N][N];
    bool vis[N][N];
    int dx[] = {0,0,-1,1};
    int dy[] = {-1,1,0,0};
    int n,sx = 1,sy = 1,ex = 1,ey = 1;
    std::priority_queue<node,std::vector<node>,std::greater<node>> pq;
    auto bfs = [&]() ->void {
        while(!pq.empty()) pq.pop();
        memset(vis,false,sizeof vis);
        t.x = sx,t.y = sy,t.s = 0;
        vis[sx][sy] = true;
        pq.push(t);
        while(!pq.empty()) {
            t = pq.top();pq.pop();
            if(t.x==ex&&t.y==ey) {
                cout << t.s << '\n';
                return;
            }
            for(int i = 0;i<4;i++) {
                int u = t.x+dx[i],v = t.y+dy[i];
                if(u<1||u>n||v<1||v>n||vis[u][v]||g[u][v]=='#') continue;
                vis[u][v] = true;
                int ds = 1;
                if(g[u][v]!='.') ds += int(g[u][v]^48);
                t1.x = u,t1.y = v,t1.s = t.s+ds;
                pq.push(t1);
            }
        }
        cout << -1 << '\n';
    };
    while(cin >> n) {
        ex = n,ey = n;
        for(int i = 1;i<=n;i++) {
            for(int j = 1;j<=n;j++) {
                cin >> g[i][j];
            }
        }
        bfs();
    }
    return 0;
}

问题 H: 迷宫

 

参考题解:

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using std::cin;
using std::cout;
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    constexpr int N = 1e2+5;
    struct node {
        int x,y,s;
    }t,t1;
    char g[N][N];
    bool vis[N][N];
    int dx[] = {0,0,-1,1};
    int dy[] = {-1,1,0,0};
    int sx,sy,ex,ey,k,n,m;
    std::queue<node> q;
    auto bfs = [&]()->void {
        memset(vis,false,sizeof vis);
        while(!q.empty()) q.pop();
        t.x = sx,t.y = sy,t.s = -1;
        vis[sx][sy] = true;
        q.push(t);
        while(!q.empty()) {
            t = q.front();q.pop();
            if(t.x==ex&&t.y==ey&&t.s<=k) {
                cout << "yes\n";
                return;
            }
            for(int i = 0;i<4;i++) {
                t1.x = t.x+dx[i],t1.y = t.y+dy[i];
                int &u = t1.x,&v = t1.y;
                while(u>=1&&u<=n&&v>=1&&v<=m&&g[u][v]=='.') {
                    if(!vis[u][v]) {
                        t1.s=t.s+1;
                        vis[u][v] = true;
                        q.push(t1);
                    }
                    u+=dx[i],v+=dy[i];
                }
            }
        }
        cout << "no\n";
    };
    int T = 1;cin >> T;
    while(T--) {
        cin >> n >> m;
        for(int i = 1;i<=n;i++) {
            for(int j = 1;j<=m;j++) {
                cin >> g[i][j];
            }
        }
        cin >> k >> sy >> sx >> ey >> ex;
        bfs();
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(五)

静电放电过程是一个很复杂的过程&#xff0c;下面比对人体持金属对产品放电和静电发生器对产品进行接触放电过程的详细分解说明。 1. 人持金属对产品放电过程 人对产品所产生的静电放电&#xff0c;会发生下面一系列的事件&#xff1a; 1&#xff09;当手持金属片接近产品的…

嵌入式Linux开发实操(十九):Nand Flash驱动的实现

前言: nand flash从硬件连接上看,如下图,有专用接口,数据线有8或16根。 Nand Flash按每个存储单元Cell内存储比特个数不同可分为 SLC(Single-Level Cell存储1个比特)、MLC(Multi-Level Cell存储2个比特) 、 TLC(Triple-Level Cell存储3个比特)、QLC(Quad-Level C…

39.1k Star ! Meta GPT:AI Agent 排名第一,第一家人工智能软件公司,迈向自然语言编程

作者&#xff1a;Aitrainee | AI进修生 排版太难了&#xff0c;请点击这里查看原文&#xff1a;39.1k Star ! Meta GPT&#xff1a;AI Agent 排名第一&#xff0c;第一家人工智能软件公司&#xff0c;迈向自然语言编程 39.1k Star ! Meta GPT&#xff1a;AI Agent 排名第一&…

XV6源码阅读——页表

文章目录 前言分页硬件实际转换 内核地址空间 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招。打算尝试6.S081&#xff0c;将它的Lab逐一实现&#xff0c;并记录期间心酸历程。 代码下载 官方网站&#xff1a;6.S081官方网站 分页硬件 RISC-V指令&#xff08;用户和内…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

LMbench单独执行某一个组件 | benchmark教程

LMbench官网 > https://lmbench.sourceforge.net/man/ 下载源码&#xff0c;编译得到的Benchmark是由很多文件组成的&#xff0c;上面的链接中官方给出了每个组件的各参数的含义&#xff0c;可以对照着修改使用&#xff0c;以达到测试在某个组件上表现的作用。 以bw_mem为例…

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

虚拟局域网PPTP配置与验证

虚拟局域网PPTP配置与验证 前言PPTP服务侧安装配置REF 前言 虚拟专用网&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是一种通过公共网络建立安全的连接的技术。它能够在不同的地理位置之间建立私密的通信通道&#xff0c;实现远程访问网络资源的安全性和隐…

QCC3040/QCC3056/QCC3086/QCCXXX发射(TX SOURCE)AUX/USB发射A2DP音乐/HFP通话

之前写过几篇USB 发射的文章&#xff0c;如下链接&#xff0c;现在在通话的基础上增加新的玩法。 https://blog.csdn.net/TengTaiTech/article/details/137339630?spm1001.2014.3001.5501 https://blog.csdn.net/TengTaiTech/article/details/137790676?spm1001.2014.3001.55…

论文解读:(VPT)Visual Prompt Tuning

文章汇总 要解决的问题 大型模型应用于下游任务本身就存在挑战。最明显的(通常也是最有效的)适应策略是对预先训练好的模型进行全面的端到端微调。 动机 只微调参数的一个子集 解决的办法 只在输入空间中引入少量特定于任务的可学习参数&#xff0c;而在下游训练期间冻结…

Attention和Transformer灵魂七问

1. 引言 最近&#xff0c;ChatGPT和其他聊天机器人将大语言模型LLMs推到了风口浪尖。这就导致了很多不是学ML和NLP领域的人关注并学习attention和Transformer模型。在本文中&#xff0c;我们将针对Transformer模型结构提出几个问题&#xff0c;并深入探讨其背后的技术理论。这…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢&#xff1f;工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求&#xff0c;不仅有利于企业内部管理的规范化&#xff0c;还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

Java多线程交替打印

多线程交互 在Java中&#xff0c;可以使用synchronized关键字或者java.util.concurrent包中的工具来实现多线程交替打印。以下是一个使用synchronized关键字的示例&#xff1a; public class AlternatePrinting {private static final Object lock new Object();private sta…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

Giants Planet 宣布推出符文,建立在坚实价值的基础上

这是一项旨在释放我们不断发展的生态系统全部潜力的新功能。符文提供了一种更简单的方法来创建通证&#xff0c;这些通证可以从比特币区块链的安全性和去中心化中获益。 符文&#xff1a;建立在坚实的基础上 可以将比特币视为存储贵重物品的安全保险库。 符文就像保险库中的特…

Idea:阿里巴巴Java编码插件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Alibaba Java Coding Guidelines插件介绍 二、使用步骤 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Alibaba Java Coding …

微软如何打造数字零售力航母系列科普02 --- 微软低代码应用平台加速企业创新 - 解放企业数字零售力

微软低代码应用平台推动企业创新- 解放企业数字零售力 微软在2023年GARTNER发布的魔力象限图中处于头部领先&#xff08;leader&#xff09;地位。 其LCAP产品是Microsoft Power Apps&#xff0c;扩展了AI Builder、Dataverse、Power Automate和Power Pages&#xff0c;这些都包…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输&#xff0c;TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

基于JavaWeb手工艺品购物系统的设计与实现

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

实现游戏地图读取与射击运行

射击代码来源自2D 横向对抗射击游戏&#xff08;by STF&#xff09; - CodeBus 地图读取改装自 瓦片地图编辑器 解决边界检测&#xff0c;实现使用不同像素窗口也能移动不闪退-CSDN博客 // 程序&#xff1a;2D RPG 地图编辑器改游戏读取器 // 作者&#xff1a;民用级脑的研发…