万绿丛中一点红
题目描述
对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入格式
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,$2^{24}$) 内。所有同行数字间用空格或 TAB 分开。
输出格式
在一行中按照 (x, y): color
的格式输出所求像素点的位置以及颜色值,其中位置 x
和 y
分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique
;如果这样的点不存在,则输出 Not Exist
。
输入样例1
1 | 8 6 200 |
输出样例1
1 | (5, 3): 16711680 |
输入样例2
1 | 4 5 2 |
输出样例2
1 | Not Unique |
输入样例3
1 | 3 3 5 |
输出样例3
1 | Not Exist |
问题解决
解题思想
本题的难点在于题意的理解。题目描述中说”找出万绿丛中的一点红,即有独一无二颜色的那个像素点”,也就是说如果有两个或两个以上的像素点颜色相同,那么它们永远不可能成为那”一点红”了,此时也就不用检查它们各自的周围的8个相邻像素的颜色与之之差了。
有一个点题目没有描述清楚,就是边缘位置的”独一无二像素”是否能成为”一点红”?显然,它们周围是不足8个像素点的,实践表明,只要它们是”独一无二”的,且与周围像素(有几个算几个)的颜色差足够大,它们同样可为”一点红”。
注意本题中行列号一直是反着来的,而且,编号都是从1开始的,这一点可能会忽略。
清楚上面的几个问题之后,本题就是一道简单的逻辑题了。
知识拓展
map定义
1 | map<int, int> mp; //键为int型,值为int型(值自动初始化为0) |
map访问
- 通过键来访问
- 通过迭代器访问
代码示例(C/C++)
1 |
|
题目来源:PAT乙级1068
作者:CHEN, Yue
单位:浙江大学