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

题目:

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

输出样例 3:

Not Exist

分析:

不用想太复杂,把数据存进数组以后在8个位置一一比较即可,如果中途一个不满足条件就continue跳过此次循环,比较下一个像素。然后所有都通过则flag++,若为2则表示存在多个唯一像素——即答案不唯一了,那么跳出所有比较,最后输出答案即可

代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include<map>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
//#define Max 100001
int color[1001][1001];//必须放在外层,不然在main里会返回巨大的异常值 
int x,y,res;
int main(){
	map<int,int> vis;
	 int i,j,n,m;
	 int tol;
	 scanf("%d %d %d",&m,&n,&tol);
	 for(i=0;i<n;i++){
	 	for(j=0;j<m;j++){
	 		scanf("%d",&color[i][j]);
	 		vis[color[i][j]]++;
		 }
	 }
	 int flag=0;//用来计算是否是唯一的一个,如果最后仍旧为0那么就是不存在,1表示唯一,2表示多个然后退出循环 
	//i,j-->
	//(i-1,j),(i-1,j-1),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j),(i+1,j-1),(i+1,j+1)
	 for(i=0;i<n;i++){
	 	for(j=0;j<m;j++){
	 		if(vis[color[i][j]]==1){
	 		//i-1,j
	 		if(i-1>=0){
	 			if(abs(color[i][j]-color[i-1][j])<=tol)
	 			   continue;
			 }
			 if(i-1>=0&&j-1>=0){//(i-1,j-1)
	 			if(abs(color[i][j]-color[i-1][j-1])<=tol)
	 			   continue;
			 }
			 if(i-1>=0&&j+1<m){//(i-1,j+1)
	 			if(abs(color[i][j]-color[i-1][j+1])<=tol)
	 			   continue;
			 }
			 if(j-1>=0){//,(i,j-1)
	 			if(abs(color[i][j]-color[i][j-1])<=tol)
	 			   continue;
			 }
			 if(j+1<m){//,(i,j+1),
	 			if(abs(color[i][j]-color[i][j+1])<=tol)
	 			   continue;
			 }
			 if(i+1<n){//(i+1,j),
	 			if(abs(color[i][j]-color[i+1][j])<=tol)
	 			   continue;
			 }
			 if(i+1<n&&j-1>=0){//(i+1,j-1),
	 			if(abs(color[i][j]-color[i+1][j-1])<=tol)
	 			   continue;
			 }
			 if(i+1<n&&j+1<m){//(i+1,j+1)
	 			if(abs(color[i][j]-color[i+1][j+1])<=tol)
	 			   continue;
			 }	 
			 flag++;
			 if(flag==2)//此数不唯一,退出 
			    break;
			 x=i;
			 y=j;	
		 }
	   }
	 } 
	 if(flag==0)
	    printf("Not Exist");
	else if(flag==2)
	    printf("Not Unique");
	else
	    printf("(%d, %d): %d",y+1,x+1,color[x][y]);
}

AC:

  • 注意有两个要求:
    1.与周围像素明显差异。
    2.此像素在所有的像素里独一无二
  • 还有就是C++里map的使用
  • 在dev定义大型的二维数组,超过760多的好像都会报异常,但只要放在main函数之外定义就没事,奇怪了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常高兴能够帮您回答这个问题。 以下是我为您生成的五十首赞美秋天的七言绝句: 1. 秋来莫忘山水情,万木丛中鹤舞翎。 2. 秋啸凉风瑟瑟起,满地黄叶舞纷飞。 3. 远山如翠翁媚女,晴日似火映池塘。 4. 高处秋风瑟瑟微,霜华铺洒夜漫漫。 5. 瑶草含香秋霁日,流水潺湲夕阳时。 6. 银霜凋零水痕迹,极目苍茫日色移。 7. 江畔秋色画屏障,瑞雪凝冰月色寒。 8. 西园枫叶似火,战士扬帆起故乡。 9. 常山太行叶合,小蹄八哥迎秋归。 10. 林莽苍茫秋色起,万里千翠遂相宜。 11. 望稗山黄叶缤纷,飞燕穿林相与闲。 12. 烟波画楼秋色秀,故园扶疏木叶。 13. 天绮飘风落叶残,大雁南飞怀故园。 14. 草黄花落燕归时,碧峰如翠晓凝眸。 15. 岁华虚度秋芳散,北风吹瘦水声喧。 16. 野径穿过山峦远,夕阳西下九秋寒。 17. 朱雀祠前今夜月,夜半钟声到客船。 18. 风拂枫林叶落,凉风习习思归人。 19. 晨露滋新落莲叶,寒鸦鸣道秋日归。 20. 飞花落醉斜阳里,寒鸭穿村暮色归。 21. 洛阳汴河秋色利,鸟翅泛落远山起。 22. 瑶池仙客居桂林,砧杵成婚秋色深。 23. 金秋送夕阳未央,碧浪潮生深巷扬。 24. 清风吹绕涟漪碧,江水东流月份扬。 25. 清秋遐想近高楼,情绪铺零催白头。 26. 纤云一缕映山岚,古木参差耐啜寒。 27. 天清波平闲望外,叠岸嫣然依水栏。 28. 彩斑随风楼台影,流水莹莹屋漏闻。 29. 古庙属墟芝兰香,风摆莲叶舞长江。 30. 峰回路转秋风怒,借杯酒旧追忆中。 31. 风举葱翠东海岸,夕阳余晖激浪滔。 32. 燕归花尽钟声绝,愁闻鹤舞江南宿。 33. 青松翠柏树峰抱,碧水涟漪雁阵拂。 34. 芙蓉如鬟玉如许,片片残映衣裾。 35. 铁衣飘动追秋色,酒肆歇脚种菊中。 36. 秋韵萧疏绿,簇簇霜草飞古空。 37. 汀洲秋梦碧波里,细雨横风两相依。 38. 招隐飞来碧水瀑,高枝古韵秋花蓝。 39. 喜虞九日起莲池,干树苍苔带泉痕。 40. 窗前秋雨细如丝,愁思万千寄江碧。 41. 翠峰定眸凝秋水,陇头群鹿美晴天。 42. 光风草露思潇洒,假山山水尽秋色。 43. 芳洲木兰映水影,青峰紫霄涌秋意。 44. 碧瓦朱楼临水寺,于滩渡碧莙垂。 45. 秋光秦楼黄叶路,山色空闺独卧时。 46. 珠泉琼舞愁惆怅,古涧河声激春光。 47. 金陵庙里翠微,飞鸟牵引远云漾。 48. 山涧清来隐鹭声,千古风流月廿四。 49. 小舟随转金山谷,百鸟鸣歇云峰起。 50. 风急铜驼万里辰,落叶千层故乡知。 希望我的回答能够满足您的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Amonlisa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值