1068 万绿丛中一点红(C语言20分)

对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。

输入格式:

输入第一行给出三个正整数,分别是 MN(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。

输出格式:

在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 x 和 y 分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique;如果这样的点不存在,则输出 Not Exist。

这一题我一开始在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值