对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入格式:
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。
输出格式:
在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 x 和 y 分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique;如果这样的点不存在,则输出 Not Exist。
![](https://img-blog.csdnimg.cn/img_convert/8fea6528f54794e6eaedc8f477b11d71.png)
![](https://img-blog.csdnimg.cn/img_convert/87e8bc62d93f505118805109899ba927.png)
![](https://img-blog.csdnimg.cn/img_convert/5c2b8c9cd0b01a5af68f7ba960a136c2.png)
这一题我一开始在PAT上提交不出结果,总是显示段错误,后来我发现int c[2<<23] = { 0 };这一句一定要写在main()函数外,让所申请的内存来自于数据段才能分配足够大的内存QAQ
#include <stdio.h>
#include<math.h>
int func(int a[][1005], int x, int y, int len)
{
if (fabs(a[y][x] - a[y - 1][x - 1]) <= len
|| fabs(a[y][x] - a[y][x - 1]) <= len
|| fabs(a[y][x] - a[y + 1][x - 1]) <= len
|| fabs(a[y][x] - a[y - 1][x]) <= len
|| fabs(a[y][x] - a[y - 1][x + 1]) <= len
|| fabs(a[y][x] - a[y][x + 1]) <= len
|| fabs(a[y][x] - a[y + 1][x + 1]) <= len
|| fabs(a[y][x] - a[y + 1][x]) <= len)
{
return 0;
}
return 1;
}
int c[2<<23] = { 0 };//位运算<<左移一位表示乘以2,2<<23相当于2*(2的23次方)
int main()
{
int b[1005][1005];
int n, m, len;
scanf("%d %d %d", &n, &m, &len);
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &b[i][j]);
c[b[i][j]]++;
}
}
int count = 0;
int t, k;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (c[b[i][j]] == 1)
{
if (func(b, j, i, len) == 1)
{
t = i;
k = j;
count++;
}
}
}
}
if (count == 0)
printf("Not Exist\n");
else if (count == 1)
printf("(%d, %d): %d\n", k+1, t+1, b[t][k]);
else
printf("Not Unique\n");
return 0;
}