PAT 乙级练习 题解合集

本题链接

题目

对于计算机而言,颜色不过是像素点对应的一个 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:

8 6 200
0        0        0        0        0        0        0        0
65280    65280    65280    16711479 65280    65280    65280    65280
16711479 65280    65280    65280    16711680 65280    65280    65280
65280    65280    65280    65280    65280    65280    165280   165280
65280    65280    16777015 65280    65280    165280   65480    165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

输出样例 1:

(5, 3): 16711680

输入样例 2:

4 5 2
0 0 0 0
0 0 3 0
0 0 0 0
0 5 0 0
0 0 0 0

输出样例 2:

Not Unique

输入样例 3:

3 3 5
1 2 3
3 4 5

输出样例 3:

Not Exist

思路

文章最下面有两个版本的 AC 代码,其中 “改进后” 版本是看了柳神代码之后有所启发,代码框架和主要思路都是相同的。


0. 分析问题

如何判断一个像素点是否符合要求?需要满足以下两个条件:

  1. 它的颜色在图中是唯一的;
  2. 该点的颜色与其周围 8 个相邻像素的颜色差充分大(注意,如果是边上的点只需要比较 5 个点,角上的点只需要比较 3 个点)。

下面分别来解决这两个问题。

1. 判断唯一性

map<long long, int> colorCnt;
映射可以很好地解决这个问题,通过建立一个long longint的映射,在输入结束后我们可以得到图中所有不同颜色的个数,判断的时候只需要查询一个点的出现次数是否等于 1 即可。

2. 和周围像素的颜色差

在中间的点我们依次判断周围 8 个点即可,但是如何解决边角上的点?有两种简单的解决办法:a. 为四条边和四个角专门写特判;b. 在遍历 8 个点的同时判断坐标是否越界,如果超出数组范围则不判断,默认符合要求。

我的方法是为矩阵加四条边,即原本 N×MN\times MN×M 的矩阵扩充到 (N+2)×(M+2)(N+2)\times (M+2)(N+2)×(M+2)。且周围多出来的四条边以及四个角上的颜色都是-tol-1,这就保证了原本矩阵边角上的点和新加的点之间的颜色差一定大于tol,这样在遍历八个点的时候就不用特别判断了,对所有的点一视同仁即可。

加边的同时带来了另一个微小的好处,就是数组的行和列都从 1 开始计数了,符合题目的输出要求,

代码实现上怎么加边呢?不用输入后再手动加,直接把矩阵中所有元素的值初始化成-tol-1,然后再用输入覆盖掉中间的像素点即可。

代码

改进后

#include <cstdio>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
inline bool dif(LL a, LL b, LL tol) {LL c = (a > b ? a - b : b - a);return c > tol;
}
bool goodPoint(vector<vector<LL> >& matrix, int m, int n, LL tol) {for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) {if (i == 0 && j == 0)continue;if (!dif(matrix[m][n], matrix[m + i][n + j], tol))return false;}}return true;
}
int main() {int m, n, mAns, nAns, cntAns = 0;LL tol;scanf("%d%d%lld", &m, &n, &tol);vector<vector<LL> > matrix(n + 2, vector<LL>(m + 2, -tol-1));map<LL, int> colorCnt;for (int i = 1; i < n + 1; ++i) {for (int j = 1; j < m + 1; ++j) {scanf("%lld", &matrix[i][j]);++colorCnt[matrix[i][j]];} }for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (colorCnt[matrix[i][j]] == 1 && goodPoint(matrix, i, j, tol)) { ++cntAns;if (cntAns > 1) {puts("Not Unique");return 0; }mAns = j;nAns = i;} } }if (cntAns)printf("(%d, %d): %lld", mAns, nAns, matrix[nAns][mAns]);elseputs("Not Exist");return 0;
}

初次 AC

#include <cstdio>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
inline bool dif(LL a, LL b, LL tol) {LL c = (a > b ? a - b : b - a);return c > tol;
}
int main() {int m, n, mAns, nAns, cntAns = 0;LL tol;scanf("%d%d%lld", &m, &n, &tol);vector<vector<LL> > matrix(n + 2, vector<LL>(m + 2, -tol-1));map<LL, int> colorCnt;for (int i = 1; i < n + 1; ++i) {for (int j = 1; j < m + 1; ++j) {scanf("%lld", &matrix[i][j]);++colorCnt[matrix[i][j]];} }for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (colorCnt[matrix[i][j]] == 1 && dif(matrix[i][j], matrix[i + 1][j + 1], tol)&& dif(matrix[i][j], matrix[i + 1][j], tol)&& dif(matrix[i][j], matrix[i + 1][j - 1], tol)&& dif(matrix[i][j], matrix[i][j + 1], tol)&& dif(matrix[i][j], matrix[i][j - 1], tol)&& dif(matrix[i][j], matrix[i - 1][j + 1], tol)&& dif(matrix[i][j], matrix[i - 1][j], tol)&& dif(matrix[i][j], matrix[i - 1][j - 1], tol)) { ++cntAns;if (cntAns > 1) {puts("Not Unique");return 0; }mAns = j;nAns = i;} } }if (cntAns)printf("(%d, %d): %lld", mAns, nAns, matrix[nAns][mAns]);elseputs("Not Exist");return 0;
}

PAT 乙级练习 1068 万绿丛中一点红 - 超级详细的思路讲解相关推荐

  1. PAT 乙级练习 1050 螺旋矩阵 - 超级详细的思路讲解

    PAT 乙级练习 题解合集 本题链接 题目 本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按 ...

  2. 【PAT乙级】1068 万绿丛中一点红 (20 分)

    题目地址 #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> ...

  3. PAT 乙级 1068  万绿丛中一点红

    1068 万绿丛中一点红 (20 point(s)) 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像 ...

  4. C++学习之路 | PTA乙级—— 1068 万绿丛中一点红 (20 分)(精简)

    1068 万绿丛中一点红 (20 分) 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点 ...

  5. 1068 万绿丛中一点红(20 分)----(一点红,全是绿.)

    1068 万绿丛中一点红(20 分) 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的 ...

  6. 【简便解法】1068 万绿丛中一点红 (20分)

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中 ...

  7. PAT 1068. 万绿丛中一点红(20)-乙级

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

  8. Python PAT乙级 1068 万绿丛中一点红 (20分) 成功

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

  9. PTA乙级 1068 万绿丛中一点红——20分

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

最新文章

  1. Python学习心得第一周-03练习2
  2. Tomcat -- Cannot create a server using the selected type
  3. 【应用笔记】【AN001】VC#开发环境下基于以太网的4-20mA电流采集(基于modbus tcp 协议)...
  4. Android-service
  5. [TJOI2015]线性代数(最小割)
  6. JAVA EXCEL API(jxl)简介
  7. Apache Sentry架构介绍
  8. SAP UI5 testFLPService - local run will start mock server
  9. 2013年3月编程语言排行榜:有毒的Java
  10. OpenMV——串口通信+发送中心位置
  11. web前端编程语言有哪些?
  12. dedecms读取多个类别信息
  13. 药品质量不合格统计机器人
  14. 苹果cmsv10仿爱客影视搜索自适应模板
  15. markdown下载
  16. CS294(285)策略梯度学习笔记
  17. Masking GAN
  18. 学会Python好找工作吗?这就告诉你答案
  19. PTA_数据结构与算法_7-7 六度空间 (30分)
  20. STM32 CubeMx LL库-ADC操作

热门文章

  1. SUMMARIZE函数解决之前的总计错误
  2. boto3 连接aws_Python,Boto3和AWS S3:神秘化
  3. 2009-2020年天猫“双十一”成交额统计情况
  4. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
  5. 深度学习在推荐领域的应用:Lookalike 算法
  6. 微服务--应对每秒上万并发下的参数优化实战(实战经验)
  7. 扎心!“近8成人工作10年月薪没过万”,你呢?互联网人一笑而过
  8. 剪贴板增强工具CLCL
  9. winform 两个区域保持固定距离_【麻辣烫】川渝区域零担十强分析:余氏东风、力展、宇鑫、金泓达快运、长吉、西部风、海风快运、绍平、迪丰、健隆......
  10. 冬至已至,你的在职读研2023能在社科院与杜兰大学金融管理硕士项目实现吗