2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家

news2025/6/3 23:31:45

前言

在这里插入图片描述


题解

2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)。
最后一题还考验能力,需要找到合适的剪枝。


RC-v1 智能管家

分值: 20分

在这里插入图片描述

签到题,map的简单实用

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    cin >>n >> m;
    vector<int> hp(n + 1);
    for (int i = 0; i < n; i++) {
        int id; cin >> id;
        hp[i + 1] = id;
    } 
    int q;
    cin >> q;
    while (q-- > 0) {
        map<int, int> cnt;
        int w;
        while ( cin >> w && w > 0) {
            cnt[hp[w]]++;
        }
        bool f = false;
        for (auto &e: cnt) {
            if (f) cout << " ";
            f = true;
            cout << "B" << e.first << "-" << e.second;
        }
        cout << "\n";
    }
    
    return 0;
}

RC-v2 智能陪护

分值: 25分

在这里插入图片描述
具体可查看

RC-v2 智能陪护 争议解读


#include <bits/stdc++.h>

using namespace std;

struct T {
    string name;
    int op;
    string at;
    T(string name, int op, string at)
        : name(name), op(op), at(at) {}
};

int main() {
    int n, m;
    cin >> n >> m;
    
    deque<string> man;
    deque<string> robot;
    for (int i = 1; i <= n; i++) robot.push_back(to_string(i));
    
    vector<T> seq;
    for (int i = 0; i < m; i++) {
        string name, at;
        int op;
        cin >> name >> op >> at;
        seq.push_back(T(name, op, at));
    }

    sort(seq.begin(), seq.end(), [](auto &a, auto &b) {
        if (a.at != b.at) return a.at < b.at;
        if (a.op != b.op) return a.op < b.op;
        return a.name < b.name;
    });

    int idx = 0;
    map<string, int> hp;
    int ptr = 0;
    vector<array<string, 2>> res;
    for (auto &e: seq) {        
        if (e.op == 1) {
            hp[e.name] = idx++;
            if (robot.empty()) {
                res.push_back({e.name, ""});
            }
            else {
                string v = robot.front(); robot.pop_front();
                res.push_back({e.name, v});
                cout << e.name << " - " << v << "\n";
            }
        } else {           
            int pos = hp[e.name];
            string v = res[pos][1];
            if (v == "") {
                // pass
                res[pos][1] = "NONE";
                cout << res[pos][0] << " - " << "NONE" << "\n";
            } else {
                robot.push_back(v);
                
                while (!robot.empty() && ptr < res.size()) {
                    if (res[ptr][1] != "") {
                        ptr++;
                    } else {
                        string v = robot.front(); robot.pop_front();
                        res[ptr][1] = v;
                        
                        cout << res[ptr][0] << " - " << v << "\n";
                        ptr++;
                    }
                }
            }
        }
    }    
    
    while (!robot.empty()) {
        string v = robot.front(); robot.pop_front();
        cout << v;
        cout << " \n"[robot.empty()];
    }

    return 0;
}

RC-v3 智能护理中心统计

分值:25分

考察点: 建树(指向父节点+子节点)

因为关系链最多m( m ≤ 10 5 m\le 10^5 m105), 操作次数 10 2 10^2 102, 因此每次操作全量遍历即可,整个时间复杂度最多 10 7 10^7 107

#include <bits/stdc++.h>

using namespace std;

struct Node {
    int v = 0;
    string fa = "";
    set<string> childs;
    Node() {}
    Node(int v) : v(v) {}
};

map<string, Node> mp;

bool isNum(const string &v) {
    return v[0] >= '0' && v[0] <= '9';
}

int dfs(const string &u) {
    int res = mp[u].v;
    for (const string &v: mp[u].childs) {
        res += dfs(v);
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    int n, m;
    cin >> n >> m;
    
    for (int i = 0; i < m; i++) {
        string u, v;
        cin >> u >> v;
        
        if (!mp.count(u)) {
            mp[u] = Node(isNum(u)?1:0);
        }
        if (!mp.count(v)) {
            mp[v] = Node(0);
        }
        
        mp[v].childs.insert(u);
        mp[u].fa = v;
    }
    
    // 处理操作
    string op;
    while (cin >> op && op != "E") {
        if (op == "T") {
            string u, v;
            cin >> u >> v;
            if (!mp.count(v)) {
                mp[v] = Node(0);
            }
            if (!mp.count(u)) {
                mp[u] = Node(1);
            }
            
            if (!mp[u].fa.empty()) {
                mp[mp[u].fa].childs.erase(u);
            }     
            mp[v].childs.insert(u);
            mp[u].fa = v;
        } else {
            string u;
            cin >> u;
            
            if (mp.count(u) == 0) cout << (isNum(u) ? 1 : 0) << "\n";
            else {
                cout << dfs(u) << "\n";
            }
        }
    }
    return 0;
}

RC-v4 情人节的蜜语

分值: 30分

思路: dfs + 剪枝

在这里插入图片描述

说白了在n*m的矩阵中,寻找长度为p的模式, n , m ≤ 100 , p ≤ 20 n,m\le 100, p \le 20 n,m100,p20

纯dfs搜索的话,拿不到满分,大概是25/30的样子。

那这边就需要考虑如何优化的问题了。

引入类似布隆过滤器的机制 引入类似 布隆过滤器的机制 引入类似布隆过滤器的机制

引入 c a n [ i ] [ x ] [ y ] , 表示第 i 匹配, x y 坐标开始可能性,这个 c a n 不追求去重 can[i][x][y], 表示第i匹配,xy坐标开始可能性,这个can不追求去重 can[i][x][y],表示第i匹配,xy坐标开始可能性,这个can不追求去重

如何理解这个不去重呢?

  1. 如果can为true,精确结果不保证一定为true
  2. 如果can为false,最终结果一定为false

这就是所谓的 False Positive

这个预处理后,在dfs优化,可以大大减低搜索量,就能30/30。

#include <bits/stdc++.h>
using namespace std;

int m, n, L;
vector<string> grid;
string target;
// can[i][x][y]: 从 (x,y) 匹配到 target[i] 起,能否完成剩余匹配
bool can_[21][100][100];
bool vis[100][100];
vector<pair<int,int>> path;
int dx[8]={-1,-1,-1,0,0,1,1,1}, dy[8]={-1,0,1,-1,1,-1,0,1};
bool found=false;

// 剪枝后的 DFS
void dfs(int x, int y, int idx){
    if(found) return;
    path.emplace_back(x,y);
    if(idx+1 == L){
        found = true;
        return;
    }
    vis[x][y] = true;
    for(int d=0; d<8; d++){
        int nx = x+dx[d], ny = y+dy[d];
        if(nx<0||nx>=m||ny<0||ny>=n) continue;
        if(vis[nx][ny]) continue;
        if(grid[nx][ny] != target[idx+1]) continue;
        if(!can_[idx+1][nx][ny]) continue;  // 剪掉不可能完成的
        dfs(nx, ny, idx+1);
        if(found) break;
    }
    if(!found){
        vis[x][y]=false;
        path.pop_back();
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> m >> n;
    grid.resize(m);
    for(int i=0;i<m;i++) cin >> grid[i];
    cin >> target;
    L = target.size();

    // 1) 后向可达性 DP
    memset(can_, 0, sizeof(can_));
    // 最后一层
    for(int x=0;x<m;x++){
        for(int y=0;y<n;y++){
            if(grid[x][y] == target[L-1])
                can_[L-1][x][y] = true;
        }
    }
    // 反向递推
    for(int i=L-2; i>=0; i--){
        for(int x=0;x<m;x++){
            for(int y=0;y<n;y++){
                if(grid[x][y] != target[i]) continue;
                for(int d=0; d<8; d++){
                    int nx=x+dx[d], ny=y+dy[d];
                    if(nx<0||nx>=m||ny<0||ny>=n) continue;
                    if(can_[i+1][nx][ny]){
                        can_[i][x][y] = true;
                        break;
                    }
                }
            }
        }
    }

    // 2) 从可达的起点开始 DFS
    for(int x=0; x<m && !found; x++){
        for(int y=0; y<n && !found; y++){
            if(grid[x][y]==target[0] && can_[0][x][y]){
                dfs(x,y,0);
            }
        }
    }

    // 输出
    vector<string> out(m, string(n,'.'));
    for(auto &p: path){
        out[p.first][p.second] = grid[p.first][p.second];
    }
    for(int i=0;i<m;i++){
        cout << out[i] << "\n";
    }
    return 0;
}


写在最后

在这里插入图片描述

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

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

相关文章

基于物联网(IoT)的电动汽车(EVs)智能诊断

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 做到欲望极简&#xff0c;了解自己的真实欲望&#xff0c;不受外在潮流的影响&#xff0c;不盲从&#x…

JDBC+HTML+AJAX实现登陆和单表的CRUD

JDBCHTMLAJAX实现登陆和单表的CRUD 导入maven依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…

【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 1.位图的概念 2.位图的使用方法 定义与创建 设置和清除 位访问和检查 转换为其他格式 3.位图的使用场景 1.快速…

【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)

#工作记录 一、基础工具与环境 开发工具 Git 或 GitHub Desktop&#xff08;代码管理&#xff09;Docker Desktop&#xff08;需启用 WSL2&#xff0c;容器化部署&#xff09;Python 3.11&#xff08;推荐版本&#xff0c;需添加到系统环境变量&#xff09;Node.js LTS&#xf…

海康工业相机SDK二次开发(VS+QT+海康SDK+C++)

前言 工业相机在现代制造和工业自动化中扮演了至关重要的角色&#xff0c;尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数&#xff0c;笔者在平常项目中跟海康相关人…

深度学习|pytorch基本运算-乘除法和幂运算

【1】引言 前序学习进程中&#xff0c;已经对pytorch张量数据的生成和广播做了详细探究&#xff0c;文章链接为&#xff1a; 深度学习|pytorch基本运算-CSDN博客 深度学习|pytorch基本运算-广播失效-CSDN博客 上述探索的内容还止步于张量的加减法&#xff0c;在此基础上&am…

4.2.4 Spark SQL 数据写入模式

在本节实战中&#xff0c;我们详细探讨了Spark SQL中数据写入的四种模式&#xff1a;ErrorIfExists、Append、Overwrite和Ignore。通过具体案例&#xff0c;我们演示了如何使用mode()方法结合SaveMode枚举类来控制数据写入行为。我们首先读取了一个JSON文件生成DataFrame&#…

论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction

AAAI 2024 1 INTRO 之前基于多视图的region embedding工作大多遵循相同的模式 单独的单视图表示多视图融合 但这种方法存在明显的局限性&#xff1a;忽略了不同视图之间的信息一致性 一个区域的多个视图所携带的信息是高度相关的&#xff0c;因此它们的表示应该是一致的如果能…

初学者如何微调大模型?从0到1详解

本文将手把手带你从0到1&#xff0c;详细解析初学者如何微调大模型&#xff0c;让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调&#xff1f; 想象一下&#xff0c;预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识&#xff0c;但可能无法完美…

西瓜书第十一章——降维与度量学习

文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放&#xff08;Multidimensional Scaling, MDS&#xff0c;MDS&#xff09;提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家

背景 Portainer 是一个轻量级且功能强大的容器管理面板&#xff0c;专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控&#xff0c;即使是非技术用户也能轻松上手。Portainer 支持多节点管理&#xff0c;允许用户从一个中央控制台管理多…

vscode实用配置

前端开发安装插件&#xff1a; 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤&#xff1a;在html文件下右键点击 open with live server 即可 刷力扣&#xff1a; 安装这个插件 还需要安装node.js即可

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来

点击蓝字 关注我们 CCF Opensource Development Committee 开源浪潮正从软件席卷硬件领域&#xff0c;RISC-V作为全球瞩目的开源芯片架构&#xff0c;正在重塑计算生态的版图&#xff01;相较于成熟的x86与ARM&#xff0c;RISC-V生态虽处爆发初期&#xff0c;却蕴藏着无限可能。…

python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名

import openpyxl import shutil import os # 原始文件路径 original_file "C:/Users/Administrator/Desktop/事业联考面试名单/郑州.xlsx" # 读取包含名称的Excel文件 # 修改为您的文件名 wb openpyxl.load_workbook( "C:/Users/Administrator/Desktop/事…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面

文章目录 1. 界面隐喻&#xff08;Interface metaphors&#xff09;1.1 界面隐喻的应用方式1.2 界面隐喻的优缺点 2. 交互类型2.1 Instructing&#xff08;指令式交互&#xff09;2.2 Conversing&#xff08;对话式交互&#xff09;2.3 Manipulating&#xff08;操作式交互&…

[网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)

让多个用户&#xff0c;在游戏大厅中能够进行匹配&#xff0c;系统会把实力相近的两个玩家凑成一桌&#xff0c;进行对战 约定前后端交互接口 消息推送机制 匹配这样的功能&#xff0c;也是依赖消息推送机制的 玩家 1 点击开始匹配按钮&#xff0c;就会告诉服务器&#xff1…

【数据分析】Matplotlib+Pandas+Seaborn绘图

【数据分析】MatplotlibPandasSeaborn绘图 &#xff08;一&#xff09;Matplotlib绘图1.1 matplotlib绘图方式1: 状态接口1.2 matplotlib绘图方式2: 面向对象1.3 通过安斯科姆数据集, 说明可视化的重要性1.4 MatPlotlib绘图-单变量-直方图1.5 MatPlotlib绘图-双变量-散点图1.6 …

NLP学习路线图(十五):TF-IDF(词频-逆文档频率)

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;TF-IDF&#xff08;词频-逆文档频率&#xff09; 犹如一颗恒星&#xff0c;虽古老却依然璀璨。当ChatGPT、BERT等大模型光芒四射时&#xff0c;TF-IDF作为传统方法的代表&#xff0c;其简洁性、高效性与可解…