2022 RoboCom 世界机器人开发者大赛-高职组(省赛)解题报告 | 珂学家


前言

2022 RoboCom 世界机器人开发者大赛-高职组(省赛)解题报告 | 珂学家_第1张图片


题解

2022 RoboCom 世界机器人开发者大赛-高职组(省赛)。

主题和关怀老人有关系,正能量满满。

整体很基础, 唯有T6 拼瓷砖 还稍有点意思。

2022 RoboCom 世界机器人开发者大赛-高职组(省赛)解题报告 | 珂学家_第2张图片

RC-v1 您好呀

分值: 5分
题型: hello world 变形题

#include 

using namespace std;

int main() {
    cout << "Nin Hao Ya ~\n";
    return 0;
}

RC-v2 爷爷奶奶您好呀

分值: 10分
考察点:基本的分支判定等

#include 

using namespace std;

int main() {
    string s, x, m;
    cin >> s >> x >> m;
    if (s == "F") {
        cout << x << " NaiNai Nin Hao Ya ~\n";
    } else {
        cout << x << " YeYe Nin Hao Ya ~\n";
    }
    return 0;
}

RC-v3 智能监测

分值: 10分

#include 

using namespace std;

int main() {
    int n, T;
    cin >> n >> T;
    for (int i = 0; i < n; i++) {
        string s;
        int v;
        cin >> s >> v;
        if (v < 80 - T || v > 80 + T) {
            cout << s << " " << v << "\n";
        }
    }
    return 0;
}

RC-v4 生成字母串

分值: 15分

考察字符的大写小写互转,左移/右移变换

需要注意的是:

  1. 初始字母也在输出结果中
  2. 忽略操作 是 不产生新字符的意思

#include 

using namespace std;

int main() {
    int n;
    char c;
    cin >> n >> c;
    string s;
    cin >> s;

    string res;
    res.push_back(c);
    for (int i = 0; i < n; i++) {
        char op = s[i];
        if (op == '0') {
            if (c >= 'a' && c <= 'z') {
                c = toupper(c);
                res.push_back(c);
            } else if (c >= 'A' && c <= 'Z') {
                c = tolower(c);
                res.push_back(c);
            }
        } else {
            if (c >= 'b' && c <= 'z') {
                c = c - 1;
                res.push_back(c);
            }
            else if (c >= 'A' && c < 'Z') {
                c = c + 1;
                res.push_back(c);
            }
        }
    }
    cout << res << endl;
    return 0;
}

RC-v5 数字宝宝

分值: 15分

考察点: 整数的按位操作

#include 

using namespace std;

int main() {
    int u, v;
    cin >> u >> v;
    int r1 = 0, r2 = 1;
    while (u > 0) {
        r1 += (u % 10);
        u /= 10;
    }
    while (v > 0) {
        r2 *= (v % 10);
        v /= 10;
    }
    if (r1 < r2) {
        swap(r1, r2);
    }
    cout << r1 << r2 << "\n";
    return 0;
}

RC-v6 拼瓷砖

分值: 20分
题型: 模拟

2022 RoboCom 世界机器人开发者大赛-高职组(省赛)解题报告 | 珂学家_第3张图片

按照题目进行模拟

for i in range(n):
	for j in range(m):
		if vis[i][j]: continue;
		w = 0
		# 枚举正方形的边长
		for k in range(1, min(n - i, m - j)):
			# 增量check,新增的行和列
		# change w * w set true

大概是按照这个框架进行,这边时间复杂度预估很有意思

很像单调栈那种均摊,即一进一出,所以别看有4个for循坏,实际上时间复杂度为 O ( n ∗ m ) O(n*m) O(nm)

如果你只得到 15/20

不妨考虑下如下case

输入

3 3
baa
aaa
aaa

输出

3
color = a; size = 1; amount = 4
color = a; size = 2; amount = 1
color = b; size = 1; amount = 1

在扩展匹配的时候,需要把已经访问的排除在外。 在扩展匹配的时候,需要把已经访问的排除在外。 在扩展匹配的时候,需要把已经访问的排除在外。



#include 

using namespace std;

struct Sq {
    char c;
    int w;
    bool operator<(const Sq&lhs) const {
        if (c != lhs.c) return c < lhs.c;
        return w < lhs.w;
    }
};

int main() {
    int n, m;
    cin >> n >> m;
    vector<string> g(n);
    for (int i = 0; i < n; i++) {
        cin >> g[i];
    }

    vector<vector<bool>> vis(n, vector<bool>(m, false));
    map<Sq, int> hp;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (vis[i][j]) continue;

            int w = 1;
            for (int L = 1; i + L <= n && j + L <= m; L++) {
                bool ok = true;
                for (int k = 0; k < L; k++) {
                    if (g[i + L - 1][j+k] != g[i][j] || vis[i+L - 1][j+k]) {
                        ok = false;
                        break;
                    }
                }
                for (int k = 0; k < L; k++) {
                    if (g[i + k][j+L - 1] != g[i][j] || vis[i+k][j+L-1]) {
                        ok = false;
                        break;
                    }
                }

                if (!ok) {
                    break;
                } 
                w = L;
            }

            for (int s = 1; s <= w; s++) {
                for (int t = 1; t <= w; t++) {
                    vis[i + s - 1][j + t - 1] = true;
                }
            }
            hp[{g[i][j], w}]++;
        }
    }

    cout << hp.size() << "\n";
    for (auto &[e, v] : hp) {
        cout << "color = " << e.c << "; size = " << e.w << "; amount = " << v << "\n";
    }

    return 0;
}

RC-v7 燕归来

分值: 25分

知识点: 集合的差集操作


#include 

using namespace std;

int main() {
    int n;
    cin >> n;
    set<string> out;
    for (int i = 0; i < n; i++) {
        string s; cin >> s;
        out.insert(s);
    }

    int m;
    cin >> m;
    set<string> in;
    for (int i = 0; i < m; i++) {
        string s; cin >> s;
        in.insert(s);
    }

    vector<string> res;
    for (auto &k: out) {
        if (in.find(k) == in.end()) res.push_back(k);
    }
    if (res.empty()) {
        cout << "All Back\n"; 
    } else {
        cout << "Missing: " << res.size() << "\n";
        for (string &k: res) cout << k << "\n";
    }

    vector<string> res2;
    for (auto &k: in) {
        if (out.find(k) == out.end()) res2.push_back(k);
    }
    if (res2.empty()) {
        cout << "All Known\n"; 
    } else {
        cout << "New: " << res2.size() << "\n";
        for (string &k: res2) cout << k << "\n";
    }
    
    return 0;
}

也可以借助stl中的set_difference函数



#include 

using namespace std;

int main() {
    int n;
    cin >> n;
    set<string> out;
    for (int i = 0; i < n; i++) {
        string s; cin >> s;
        out.insert(s);
    }

    int m;
    cin >> m;
    set<string> in;
    for (int i = 0; i < m; i++) {
        string s; cin >> s;
        in.insert(s);
    }

    vector<string> res;
    set_difference(out.begin(), out.end(), in.begin(), in.end(), 
    	inserter(res, res.begin()));

    if (res.empty()) {
        cout << "All Back\n"; 
    } else {
        cout << "Missing: " << res.size() << "\n";
        for (string &k: res) cout << k << "\n";
    }

    vector<string> res2;
    set_difference(in.begin(), in.end(), out.begin(), out.end(),
    	inserter(res2, res2.begin()));    
    if (res2.empty()) {
        cout << "All Known\n"; 
    } else {
        cout << "New: " << res2.size() << "\n";
        for (string &k: res2) cout << k << "\n";
    }
    
    return 0;
}


写在最后

你可能感兴趣的:(算法,深度优先,人工智能,python,java)