1 条题解
-
0
题目分析
给定标准图像 ( a ) 和扫描图像 ( b ),置信度为 ( b ) 与 ( a ) 对应像素值差的绝对值 ( \leq 100 ) 的像素占比。由于代币可多种方式插入,需考虑 ( b ) 的所有旋转(( 0^\circ, 90^\circ, 180^\circ, 270^\circ ))及垂直翻转后再旋转的情况,取最高置信度。
解题思路
- 读入图像:读取标准图像 ( a ) 和扫描图像 ( b )。
- 原始矩阵旋转:对 ( b ) 进行 ( 0^\circ, 90^\circ, 180^\circ, 270^\circ ) 旋转,每次计算置信度。
- 垂直翻转后旋转:垂直翻转 ( b ),再进行 ( 0^\circ, 90^\circ, 180^\circ, 270^\circ ) 旋转,每次计算置信度。
- 取最大值:从所有计算的置信度中取最大值,保留两位小数输出。
通过模拟图像的旋转与翻转操作,遍历所有可能情况,即可准确找到最高置信度。
#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
- 上传者