社区讨论
警钟乱撅碎
P3186[HNOI2007] 所罗门的咒语参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj1qdn7
- 此快照首次捕获于
- 2025/11/03 19:17 4 个月前
- 此快照最后确认于
- 2025/11/03 19:17 4 个月前
论如何确定阈值
论 · 如何快乐的写这道题
CPP#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
const int dx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};
int L, H;
vector<vector<int>> grid;
bool visited[100][100];
string charset = "0123456789ADELX";
struct Region {
int minX, maxX, minY, maxY;
int sumBrightness;
int pixelCount;
double centroidX, centroidY;
};
void bfs(int x, int y, int threshold, Region& reg) {
queue<pair<int, int>> q;
q.push({x, y});
visited[x][y] = true;
reg.minX = reg.maxX = x;
reg.minY = reg.maxY = y;
reg.sumBrightness = grid[x][y];
reg.pixelCount = 1;
while (!q.empty()) {
auto [cx, cy] = q.front(); q.pop();
for (int d = 0; d < 8; d++) {
int nx = cx + dx[d];
int ny = cy + dy[d];
if (nx >= 0 && nx < H && ny >= 0 && ny < L && !visited[nx][ny] && grid[nx][ny] > threshold) {
visited[nx][ny] = true;
q.push({nx, ny});
reg.minX = min(reg.minX, nx);
reg.maxX = max(reg.maxX, nx);
reg.minY = min(reg.minY, ny);
reg.maxY = max(reg.maxY, ny);
reg.sumBrightness += grid[nx][ny];
reg.pixelCount++;
}
}
}
reg.centroidX = (reg.minX + reg.maxX) / 2.0;
reg.centroidY = (reg.minY + reg.maxY) / 2.0;
}
int main() {
cin >> L >> H;
grid.resize(H, vector<int>(L));
for (int i = 0; i < H; i++) {
for (int j = 0; j < L; j++) {
cin >> grid[i][j];
}
}
int bestT = -1;
vector<Region> bestRegions;
for (int T = 0; T <= 255; T++) {
memset(visited, 0, sizeof(visited));
vector<Region> regions;
for (int i = 0; i < H; i++) {
for (int j = 0; j < L; j++) {
if (!visited[i][j] && grid[i][j] > T) {
Region reg;
bfs(i, j, T, reg);
regions.push_back(reg);
}
}
}
if (regions.size() < 1 || regions.size() > 9) continue;
double meanY = 0;
for (auto& r : regions) meanY += r.centroidY;
meanY /= regions.size();
double varY = 0;
for (auto& r : regions) varY += (r.centroidY - meanY) * (r.centroidY - meanY);
varY /= regions.size();
if (varY > 10.0) continue;
sort(regions.begin(), regions.end(), [](const Region& a, const Region& b) {
return a.centroidY < b.centroidY;
});
bool valid = true;
for (auto& r : regions) {
int width = r.maxY - r.minY + 1;
if (width >= 10) {
valid = false;
break;
}
}
if (!valid) continue;
bestT = T;
bestRegions = regions;
break;
}
if (bestT != -1) {
int t = bestRegions.size();
cout << t << endl;
string password;
for (auto& r : bestRegions) {
int avgBright = r.sumBrightness / r.pixelCount;
int idx = (avgBright - bestT) % 15;
if (idx < 0) idx += 15;
password += charset[idx];
}
cout << password << endl;
} else {
cout << "1\n0" << endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...