C++ 解决方案:还原 GOS2021 图标放置流程
C++ 解决方案:还原 GOS2021 图标放置流程
果果操作系统 (Guo Operating System,GOS) 近期推出了 2021 船新版本。在 GOS2021 的默认设置中,桌面可视为 nm 的网格,一个文件图标占用 22 的正方形空间,必须放置在整格点之内,且不能超出桌面。GOS2021 引入了一些'人'性'化'的特性,例如允许图标重叠。
GOS2021 的图标堆叠系统规定,当同一格内存在多个重叠图标时,只显示最后放置的图标。你眼神不太好,当一个图标被遮挡一半以上时,你就难以分辨出来了。
经过一段时间的使用,你已在 GOS2021 系统中放置了 k 个图标 (从 1 到 k 编号),但是你忘了图标放置的顺序,你想:能否通过桌面显示的内容恢复图标放置的流程?
输入格式
第 1 行输入 3 个整数 n、m、k。
接下来 n 行,每行输入 m 个非负整数 a_i,j,构成一个 n*m 的方阵,描述 GOS2021 系统的桌面图标。数字 0 代表这个位置没有放置图标,其它数字代表占据这一格的图标的编号。
你眼神不好,因此在放置时不会把某个图标遮挡住一半以上。
数据保证当前桌面一定是通过合法的图标放置得到的,且图标的编号为 1∼k 。
输出格式
输出图标放置的流程,共 k 行,每行输出 3 个整数 id_i、x_i、y_i,表示第 i 个放置的图标编号为 id_i ,左上角格点的放置位置为 (x_i,y_i)。
注意,图标必须完整的放置在桌面上,即 1≤x_i≤n−1 ,1≤y_i≤m−1。
若有多种放置流程,输出任意一种均可。
示例代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> desktop(n, vector<int>(m, 0));
vector<pair<int, pair<int, int>>> placement;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> desktop[i][j];
if (desktop[i][j] != 0) {
placement.push_back({desktop[i][j], {i, j}});
}
}
}
vector<vector<int>> result(n - 1, vector<int>(m - 1, 0));
for (auto p : placement) {
int id = p.first;
int x = p.second.first;
int y = p.second.second;
result[x][y] = id;
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < m - 1; j++) {
cout << result[i][j] << " " << i + 1 << " " << j + 1 << endl;
}
}
return 0;
}
解释
在该解决方案中,首先读取输入的桌面大小 n、m 和图标数量 k。然后创建一个大小为 n×m 的二维向量 desktop 来表示桌面,其中每个元素表示对应位置上放置的图标编号。同时创建一个向量 placement 来保存已放置的图标及其位置。
接下来,通过嵌套循环读取桌面上每个位置的图标编号,并将其添加到 placement 向量中。然后,创建一个大小为 n-1×m-1 的二维向量 result 来表示图标放置的流程,初始值都为 0。
然后,遍历 placement 向量,取出每个图标及其位置,将其编号放置到 result 向量对应位置上。
最后,通过嵌套循环遍历 result 向量,输出图标放置的流程,即图标编号和左上角格点的放置位置。
请注意,该解决方案假设输入的桌面一定是通过合法的图标放置得到的,且图标的编号为 1 到 k。如果有多种放置流程,该解决方案将输出其中一种。
原文地址: https://www.cveoy.top/t/topic/pau7 著作权归作者所有。请勿转载和采集!