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

设计思路:
  1. isunique() 判断唯一性,暴力查找(居然没超时)
  2. isdiff() 判断颜色差充分大,难点在于处理边界上的点
  3. 用了变长数组,注意变长数组传递给函数要先传递大小
编译器:C (gcc)
#include <stdio.h>
#include <stdlib.h>

int isunique(int m, int n, int fig[n][m], int x, int y);
int isdiff(int m, int n, int fig[n][m], int x, int y, int tol);

int main()
{
        int m, n, tol;
        int i, j, count = 0, x, y;

        scanf("%d %d %d", &m, &n, &tol);

        int fig[n][m];
        for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
                        scanf("%d", &fig[i][j]);

        for (i = 0; count < 2 && i < n; i++) {
                for (j = 0; count < 2 && j < m; j++) {
                        if (isunique(m, n, fig, j, i)
                        && isdiff(m, n, fig, j, i, tol)) {
                                count++;
                                y = i;
                                x = j;
                        }
                }
        }

        if (count == 0)
                printf("Not Exist");
        else if (count == 1)
                printf("(%d, %d): %d", x + 1, y + 1, fig[y][x]);
        else
                printf("Not Unique");

        return 0;
}

int isunique(int m, int n, int fig[n][m], int x, int y)
{
        int i, j;
        for (i = 0; i < n; i++)
                for (j = 0; j < m; j++)
                        if (fig[i][j] == fig[y][x] && !(i == y && j == x))
                                return 0;
        return 1;
}

int isdiff(int m, int n, int fig[n][m], int x, int y, int tol)
{
        if((y > 0   && x > 0   ? abs(fig[y][x] - fig[y - 1][x - 1]) > tol : 1)
        && (y > 0              ? abs(fig[y][x] - fig[y - 1][x    ]) > tol : 1)
        && (y > 0   && x < m-1 ? abs(fig[y][x] - fig[y - 1][x + 1]) > tol : 1)
        && (           x > 0   ? abs(fig[y][x] - fig[y    ][x - 1]) > tol : 1)
        && (           x < m-1 ? abs(fig[y][x] - fig[y    ][x + 1]) > tol : 1)
        && (y < n-1 && x > 0   ? abs(fig[y][x] - fig[y + 1][x - 1]) > tol : 1)
        && (y < n-1            ? abs(fig[y][x] - fig[y + 1][x    ]) > tol : 1)
        && (y < n-1 && x < m-1 ? abs(fig[y][x] - fig[y + 1][x + 1]) > tol : 1))
                return 1;
        return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值