PAT乙级1068 万绿丛中一点红 (坑坑坑)

2024-04-17 03:32

本文主要是介绍PAT乙级1068 万绿丛中一点红 (坑坑坑),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184
在这里插入图片描述
题意解读:
找出有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
说明要找的点满足条件:
1.颜色值和其他所有像素点不一样
2.颜色值与相邻8个颜色差的绝对值都大于阈值(在边角处是相邻5个、3个,这里容易理解错题意,以为只有相邻8个时候才算,但是题目强调的地方在于不是相邻四个)

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

注意:
1.N是行,M是列,结果输出列行,容易弄反
2.在处理边角上的点时,我使用了max和min函数(详细请见代码)
3.遍历9宫格的时候记得排除中心点

思路:
我用vector储存满足条件2的点,用map记录颜色数量从而可以判断是否满足条件1,最后遍历vector统计满足mp[i]==1的也就是满足条件1的点。这样统计得到了同时满足两个条件的点的数量。
然后根据数量为0,为1,大于1三种进行判断

#include<bits/stdc++.h>
const int maxn=1000;
const int inf=1e9;
using namespace std;
int M,N,D;
int a[maxn+5][maxn+5];
struct node{int row,line,val;
};
vector<node>ans;
map<int,int>mp;
int main()
{cin>>M>>N>>D;for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){scanf("%d",&a[i][j]);}}for(int i=1;i<=N;i++){for(int j=1;j<=M;j++){int flag=1;for(int k=max(1,i-1);k<=min(i+1,N);k++){for(int w=max(1,j-1);w<=min(j+1,M);w++){if(!(k==i&&w==j)&&abs(a[i][j]-a[k][w])<=D){flag=0;break;}}}mp[a[i][j]]++;if(flag==1){ans.push_back({i,j,a[i][j]});}}}int cnt=0;for(int i=0;i<ans.size();i++){if(mp[ans[i].val]==1){cnt++;//cout<<ans[i].line<<" "<<ans[i].row<<endl;}}if(cnt==0){cout<<"Not Exist"<<endl;}if(cnt>1){cout<<"Not Unique"<<endl;}if(cnt==1)for(int i=0;i<ans.size();i++){if(mp[ans[i].val]==1)printf("(%d, %d): %d",ans[i].line,ans[i].row,ans[i].val);}return 0;
}

这篇关于PAT乙级1068 万绿丛中一点红 (坑坑坑)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910687

相关文章

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

力扣SQL仅数据库(1068~1084)

1068. 产品销售分析1 需求 编写解决方案,以获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。输入:Sales 表:+---------+------------+------+----------+-------+| sale_id | product_id | year | quantity | pri

PAT (Advanced Level) Practice

1001:  题目大意: 计算 a+b 的结果,并以标准格式输出——即每三个数字一组,组之间用逗号分隔(如果数字少于四位,则不需要逗号分隔)  解析: 我们知道相加右正有负,对于样例来说 Sample Input: -1000000 9 Sample Output: -999,991 如果是从左往右,算上负号的话输出应该是-99,999,1 从右往左:-,999,991离正确

poj 1068 Parencodings

模拟的题型,基本难度不大,关键读懂题意: 对于给出的原括号串,存在两种数字密码串: 1.p序列:当出现匹配括号对时,从该括号对的右括号开始往左数,直到最前面的左括号数,就是pi的值。 2.w序列:当出现匹配括号对时,包含在该括号对中的所有右括号数(包括该括号对),就是wi的值。 题目的要求:对给出的p数字串,求出对应的s串。 串长限制均为20 提示:在处理括号序列时可以使用一个小技巧,把括号序列

1050 String Subtraction——PAT甲级

Given two strings S1​ and S2​, S=S1​−S2​ is defined to be the remaining string after taking all the characters in S2​ from S1​. Your task is simply to calculate S1​−S2​ for any given strings. However,

LightOJ 1068 Investigation (数位dp)

http://www.lightoj.com/volume_showproblem.php?problem=1068 求出区间[A,B]内能被K整除且各位数字之和也能被K整除的数的个数。(1 ≤ A ≤ B < 231 and 0 < K < 10000) 算是最简单的数位dp了,k在这里是10000,三维数组都开不开。但是想想会发现A,B最多有10位,各位数字之和不会超过90,那么当

洛阳送变电工程设计乙级资质申请流程方法

一、前期准备 确认资质申请条件:查阅最新的《电力行业送变电工程设计企业资质标准》和地方相关政策。 确认企业的注册资金、技术人员配置、办公场所、技术装备等是否符合资质标准的要求。 组织技术人员:配置齐全合理的专业技术人员,包括但不限于: 注册电气工程师(发输变电)若干名 二级/一级注册结构工程师 二级注册建筑师 给排水、暖通中级工程师各至少一名 电力系统、通信保护、概预算、总图高级工

1105 链表合并——PAT乙级

给定两个单链表 L1​=a1​→a2​→⋯→an−1​→an​ 和 L2​=b1​→b2​→⋯→bm−1​→bm​。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a1​→a2​→bm​→a3​→a4​→bm−1​⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。 输入格式: 输入首先在第一

1110 区块反转——PAT乙级

给定一个单链表 L,我们将每 K 个结点看成一个区块(链表最后若不足 K 个结点,也看成一个区块),请编写程序将 L 中所有区块的链接反转。例如:给定 L 为 1→2→3→4→5→6→7→8,K 为 3,则输出应该为 7→8→4→5→6→1→2→3。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (