首页 > 编程语言 >小猴编程周赛C++ | 六面世界

小猴编程周赛C++ | 六面世界

时间:2024-06-04 09:04:45浏览次数:23  
标签:周赛 int step tp yy vis xx C++ 小猴

学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!

附上汇总贴:小猴编程C++ | 汇总-CSDN博客


【题目描述】

六面世界的地图由六边形格子组成,地图一共n行,奇数行有m格,偶数行有m-1格。下图是一个n=5,m=5的地图。

小明想从起点S走到终点E,但是地图上有敌国的骑士把守,每个骑士有自己的攻击距离k,它可以向6个方向直线攻击最多k个格子,小明不能进入会被骑士攻击到的格子。

在这里插入图片描述

给出起点S终点E和地图上的骑士位置和攻击距离,小明每次可以移动到1个相邻的格子。问小明从起点移动到终点最少需要多少次移动。

【输入】

第1行,两个正整数n,m

第2~n+1行,第2,4,…行每行有m格字符,第3,5,…行每行有m-1个字符且开头有一个空格。字符之间用空格隔开。

字符S表示起点,字符E表示终点,字符0表示空地,字符1~9表示一个骑士,他的攻击距离为这个数字。

【输出】

输入1个整数,小明的最少移动次数。如果无法到达终点,输出-1。

【输入样例】

5 5
1 0 0 0 0
 0 0 0 0
0 S 0 0 0 
 0 0 0 0 
0 2 0 0 E

【输出样例】

5

【代码详解】

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
char a[1005][2005], vis[1005][2005];
int n, m, res=-1;
int dx[6] = {1, 1, -1, -1, 0, 0};
int dy[6] = {1, -1, 1, -1, 2, -2};
struct node {
    int x, y, step;
};

int main()
{
    cin >> n >> m;
    int stx, sty, edx, edy;  
    for (int i=1; i<=n; i++) {  // 初始化a数组和vis数组
        for (int j=1; j<2*m; j++) {
            a[i][j] = '0';  // 为方便排错,初始用'0'字符填充
            vis[i][j] = '0';
        }
    }
    for (int i=1; i<=n; i++) {  // 输入矩阵
        for (int j=i%2?1:2; j<2*m; j+=2) {
            cin >> a[i][j];
            if (a[i][j]=='S') stx=i, sty=j;  // 并记录起点
            if (a[i][j]=='E') edx=i, edy=j;  // 以及终点
        }
    }
    for (int x=1; x<=n; x++) {  // 预处理,将骑士周围的可以走的格子都标记为'1'
        for (int y=1; y<2*m; y++) {
            if (a[x][y]>='1' && a[x][y]<='9') {
                vis[x][y] = '1';
                int k = a[x][y] - '0';
                for (int i=1; i<=k; i++) {
                    for (int j=0; j<6; j++) {
                        int xx = x + i*dx[j];
                        int yy = y + i*dy[j];
                        if (xx>=1 && xx <=n && yy>=1 && yy<2*m) {
                            vis[xx][yy] = '1';
                        }
                    }
                }
            }
        }
    }
    queue<node> q;  // 定义队列
    node t = {stx, sty, 0};
    q.push(t);
    vis[stx][sty]='1';
    while (!q.empty()) {  // BFS搜索模板
        node tp = q.front();
        int x = tp.x, y=tp.y, step=tp.step;
        q.pop();
        if (tp.x == edx and tp.y == edy) {  // 当到达终点时,更新res为tp.step
            res = tp.step;
            break;
        }
        for (int i=0; i<6; i++) {  // 6个方向遍历
            int xx = x + dx[i];
            int yy = y + dy[i];
            if (xx>=1 && xx<=n && yy>=1 && yy<2*m && vis[xx][yy]!='1') {  // 满足条件才可以走到下一个点
                vis[xx][yy] = '1';
                node t = {xx, yy , step+1};
                q.push(t);
            }
        }
    }
    cout << res << endl;  // 输出最短步数,如果BFS结束后还没有更新,则输出初始值-1
    return 0;
}

【运行结果】

5 5
1 0 0 0 0
 0 0 0 0
0 S 0 0 0
 0 0 0 0
0 2 0 0 E
5

标签:周赛,int,step,tp,yy,vis,xx,C++,小猴
From: https://blog.csdn.net/guolianggsta/article/details/139131514

相关文章

  • 《信息学奥赛一本通 编程启蒙C++版》3126-3130(5题)
    3126:练21.3 神奇装置信息学奥赛一本通-编程启蒙(C++版)在线评测系统练21.3神奇装置信息学奥赛一本通-编程启蒙(C++版)在线评测系统3126:练21.3神奇装置_哔哩哔哩_bilibili#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b,c,d; cin>>a>>b>>c......
  • 《信息学奥赛一本通 编程启蒙C++版》3001-3280
    《信息学奥赛一本通编程启蒙C++版》3001-3005(5题)《信息学奥赛一本通编程启蒙C++版》3001-3005(5题)-CSDN博客《信息学奥赛一本通编程启蒙C++版》3006-3010(5题)《信息学奥赛一本通编程启蒙C++版》3006-3010(5题)-CSDN博客《信息学奥赛一本通编程启蒙C++版》3011-3015......
  • C/C++ for 语句的要点与注意事项
    C/C++中的 for 语句是一种常用的循环结构,用于重复执行一段代码,直到满足某个条件为止。以下是 for 语句的要点与注意事项:要点:基本语法:for 语句的基本语法为 for(initialization;condition;update){body_of_loop}。initialization:初始化循环控制变量。condition......
  • 每日练习——牛客周赛 Round 45
    小紫的总分题目描述登录—专业IT笔试面试备考平台_牛客网运行代码#include<iostream>usingnamespacestd;intmain(){inta,b,c,d,e,sum;cin>>a>>b>>c>>d>>e;sum=a+b+c+d+e;if(sum>100){cout<<"YES";}else......
  • C++的vector使用优化
    我们在上一章说了如何使用这个vector动态数组,这章我们说说如何更好的使用它以及它是如何工作的。当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置,然后删除删除旧位置的内存,也就是说当我push_back,vector容量不够......
  • 【C++初阶学习】第十二弹——stack和queue的介绍和使用
    C语言栈:数据结构——栈(C语言版)-CSDN博客C语言队列:数据结构——队列(C语言版)-CSDN博客前言:在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列,今天,我们用C++来学习这些知识,让我们探索一下其中的新的知识点目录一、stack(栈)1.栈的概述......
  • C++代码实现一个简易http服务端,返回给客户端一张图片
    注意事项sprintf读取字符串时,遇到\0会结束,所以不能用sprintf来读取*pictureBuffervoid*memcpy(void*str1,constvoid*str2,size_tn),str2会覆盖str1里的内容代码#include<func.h>charpictureBuffer[150*1024];charbuffer[200*1024];intmain(){in......
  • C++ tracy性能分析
    #defineTRACY_FIBERS#include"tracy/Tracy.hpp"#include"tracy/TracyC.h"constchar*fiber="job1";TracyCZoneCtxzone;inttest(){std::threadt1([]{TracyFiberEnter(fiber);TracyCZone(ctx,1);......
  • TensorRT c++部署onnx模型
    在了解一些概念之前一直看不懂上交22年开源的TRTModule.cpp和.hpp,好在交爷写的足够模块化,可以配好环境开箱即用,移植很简单。最近稍微了解了神经网络的一些概念,又看了TensorRT的一些api,遂试着部署一下自己在MNIST手写数字数据集上训练的一个LeNet模型,识别率大概有98.9%,实现用pytor......
  • C++命名空间(详解)
    C++基础语法C++基于C语言的改进:c++在C语言的基础上引入并扩充了面向对象的概念C++基础概念:C++是基于C语言而产生的,它即可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计在1998年出现C++98C++成熟他是标......