PAT乙级1068. 万绿丛中一点红(C语言)

AC## PAT乙级真题题解目录


/*
 * 1. 一定程度上考察对C语言的掌握
 * 2. 确定独一无二颜色的像素点
 *	2.1 颜色是一个 24 位的数值 —— 以像素数值为下标构造数组,通过计数判断独一无二
 *	2.2 即数组下标最大值 < 2^{25},大数组要定义在main函数外,防止栈溢出
 * 3. 独一无二颜色的像素点,与其周围 8 个相邻像素的颜色差需要 > TOL
 * 	3.1 边界的像素周围不足8个相邻元素 —— 给边界像素外围再包一圈颜色为0的像素,将特殊情况一般化,统一判断
 *	3.2 像素点最多1000*1000个,外围包一圈则为1002*1002个
 *	3.3 周围颜色值存在更大或更小的情况,需要借助 abs() 函数,获取绝对值
 * 4. 输出要求的像素点的位置,x为列,y为行
 */
#include <stdio.h>
#include <math.h>

#define LEN 1002

int isUnique(int arr[][LEN], int x, int y, int TOL) {
	if (abs(arr[y][x] - arr[y-1][x-1]) <= TOL //左上 
		|| abs(arr[y][x] - arr[y][x-1]) <= TOL //左
		|| abs(arr[y][x] - arr[y+1][x-1]) <= TOL //左下 
		|| abs(arr[y][x] - arr[y-1][x]) <= TOL //上
		|| abs(arr[y][x] - arr[y-1][x+1]) <= TOL //右上 
		|| abs(arr[y][x] - arr[y][x+1]) <= TOL //右 
		|| abs(arr[y][x] - arr[y+1][x+1]) <= TOL //右下 
		|| abs(arr[y][x] - arr[y+1][x]) <= TOL) { //下
		return 0;
	}
	return 1;
} 
int arr[LEN][LEN] = {0};// 每个像素的颜色, 独一无二像素点的数量 
int pixel[2 << 24] = {0};// 2 << 24 即 2^25次方,能包括任意24位像素点
int main() {
	int M, N, TOL, cnt = 0;//图像的分辨率(列,行); 像素点与相邻点的颜色差阈值 
	scanf("%d %d %d", &M, &N, &TOL);
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			scanf("%d", &arr[i][j]);
			pixel[arr[i][j]]++;//统计该像素点的数量 
		}
	}
	int x, y, color;//列、行,颜色值 
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			if (pixel[arr[i][j]] == 1) {//该像素点只有一个 
				if (isUnique(arr, j, i, TOL)) {
					cnt++;
					x = j;
					y = i;
					color = arr[i][j];
					if (cnt == 2) {
						break;
					}
				}
			}
		}
		if (cnt == 2) {
			break;
		}
	}
	if (cnt == 2) {
		printf("Not Unique\n");
	} else if (cnt == 0) {
		printf("Not Exist\n");
	} else {
		printf("(%d, %d): %d", x, y, color);
	}
	return 0;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值