1 条题解

  • 0
    @ 2025-5-7 20:42:05

    题目分析

    给定标准图像 ( a ) 和扫描图像 ( b ),置信度为 ( b ) 与 ( a ) 对应像素值差的绝对值 ( \leq 100 ) 的像素占比。由于代币可多种方式插入,需考虑 ( b ) 的所有旋转(( 0^\circ, 90^\circ, 180^\circ, 270^\circ ))及垂直翻转后再旋转的情况,取最高置信度。

    解题思路

    1. 读入图像:读取标准图像 ( a ) 和扫描图像 ( b )。
    2. 原始矩阵旋转:对 ( b ) 进行 ( 0^\circ, 90^\circ, 180^\circ, 270^\circ ) 旋转,每次计算置信度。
    3. 垂直翻转后旋转:垂直翻转 ( b ),再进行 ( 0^\circ, 90^\circ, 180^\circ, 270^\circ ) 旋转,每次计算置信度。
    4. 取最大值:从所有计算的置信度中取最大值,保留两位小数输出。

    通过模拟图像的旋转与翻转操作,遍历所有可能情况,即可准确找到最高置信度。

    #include <iostream>
    #include <algorithm>
    using namespace std;
    #include<stdio.h>
    int l, a[401][401], b[401][401];
    
    // 顺时针旋转90度
    void rotateb() { 
        int temp[401][401];
        for (int i = 1; i <= l; i++) {
            for (int j = 1; j <= l; j++) {
                temp[i][j] = b[l + 1 - j][i];
            }
        }
        for (int i = 1; i <= l; i++) {
            for (int j = 1; j <= l; j++) {
                b[i][j] = temp[i][j];
            }
        }
    }
    
    // 垂直翻转
    void flapb() { 
        for (int i = 1; i <= l / 2; i++) {
            for (int j = 1; j <= l; j++) {
                swap(b[i][j], b[l + 1 - i][j]);
            }
        }
    }
    
    // 计算置信度
    float def() { 
        int res = 0;
        for (int i = 1; i <= l; i++) {
            for (int j = 1; j <= l; j++) {
                if (abs(b[i][j] - a[i][j]) <= 100) {
                    res++;
                }
            }
        }
        return (float)(res * 1.0 / (l * l));
    }
    
    int main() {
        while (cin >> l && l) {
            for (int i = 1; i <= l; i++) {
                for (int j = 1; j <= l; j++) {
                    cin >> a[i][j];
                }
            }
            for (int i = 1; i <= l; i++) {
                for (int j = 1; j <= l; j++) {
                    cin >> b[i][j];
                }
            }
    
            float max_confidence = 0.0;
    
            // 处理原始矩阵的四种旋转(0°, 90°, 180°, 270°)
            for (int k = 0; k < 4; k++) {
                float current = def();
                if (current > max_confidence) {
                    max_confidence = current;
                }
                rotateb(); // 每次旋转90°
            }
    
            // 垂直翻转后,再处理四种旋转
            flapb();
            for (int k = 0; k < 4; k++) {
                float current = def();
                if (current > max_confidence) {
                    max_confidence = current;
                }
                rotateb(); // 每次旋转90°
            }
    
            // 输出结果,保留两位小数
            printf("%.2f\n", max_confidence * 100); 
        }
    
        return 0;
    }
    • 1

    信息

    ID
    297
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    15
    已通过
    1
    上传者