社区讨论

警钟乱撅碎

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 条回复,欢迎继续交流。

正在加载回复...