题目来源于牛客竞赛:https://ac.nowcoder.com/acm/contest/discuss
题目描述:
输入描述:
输出描述:
示例1:
示例2:
题解:
代码:
#include <bits/stdc++.h>
using namespace std;
int n, k;
int x[1 << 20], y[1 << 20];
void hilbert(int k, vector<tuple<int, int, int>> p) {
if (p.empty()) return;
if (k == 0) {
assert(p.size() == 1);
for (auto pt : p) printf("%d %d\n", x[get<0>(pt)], y[get<0>(pt)]);
} else {
vector<tuple<int, int, int>> q[4];
int sz = 1 << (k - 1);
for (auto pt : p) {
int id, x, y; tie(id, x, y) = pt;
if (x < sz and y < sz) {
q[0].emplace_back(id, y, x);
} else if (x >= sz and y < sz) {
q[1].emplace_back(id, x - sz, y);
} else if (x >= sz and y >= sz) {
q[2].emplace_back(id, x - sz, y - sz);
} else if (x < sz and y >= sz) {
q[3].emplace_back(id, sz * 2 - 1 - y, sz - 1 - x);
}
}
for (int i = 0; i < 4; i++) hilbert(k - 1, q[i]);
}
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) scanf("%d%d", x + i, y + i);
vector<tuple<int, int, int>> srt;
for (int i = 0; i < n; i++) srt.emplace_back(i, x[i] - 1, y[i] - 1);
hilbert(k, srt);
return 0;
}
更多问题,更详细题解可关注牛客竞赛区,一个刷题、比赛、分享的社区。
传送门:https://ac.nowcoder.com/acm/contest/discuss