1068 万绿丛中一点红(JAVA)

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

 

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

输入格式:

输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 TAB 分开。

输出格式:

在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 xy 分别是该像素在图像矩阵中的列、行编号(从 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

image.gif

输出样例 1:

(5, 3): 16711680

image.gif

输入样例 2:

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

image.gif

输出样例 2:

Not Unique

image.gif

输入样例 3:

3 3 5
1 2 3
3 4 5
5 6 7

image.gif

输出样例 3:

Not Exist

image.gif

代码实现:

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
/**
 * @author yx
 * @date 2022-07-24 2:25
 */
public class Main {
    static PrintWriter out=new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    public static void main(String[] args) throws IOException {
        in.nextToken();
        int M=(int) in.nval;
        in.nextToken();
        int N=(int) in.nval;
        in.nextToken();
        int tol=(int) in.nval;
        int[][] nums=new int[N][M];
        int temp=0;
        ArrayList<Integer> list=new ArrayList<>();
        ArrayList<Integer> list1=new ArrayList<>();
        ArrayList<Integer> list2=new ArrayList<>();
        HashMap<Integer,Integer> map=new HashMap<>();
        for (int i = 0; i <N ; i++) {
            for (int j = 0; j < M; j++) {
                in.nextToken();
                nums[i][j]=(int) in.nval;
                map.put(nums[i][j],map.getOrDefault(nums[i][j],0)+1);
            }
        }
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if(i-1>=0&&i+1<=N-1&&j-1>=0&&j+1<=M-1)
                        //这个地方注意一下,差值大于tol,有两种情况,大于tol,小于-tol
                    if (map.get(nums[i][j])==1 && (nums[i][j] - nums[i - 1][j] < -tol || nums[i][j] - nums[i - 1][j] > tol) && (nums[i][j] - nums[i + 1][j] > tol || nums[i][j] - nums[i + 1][j] < -tol)&& (nums[i][j] - nums[i][j - 1] > tol ||nums[i][j] - nums[i][j - 1] < -tol) && (nums[i][j] - nums[i][j + 1] > tol || nums[i][j] - nums[i][j + 1] < -tol) && (nums[i][j] - nums[i - 1][j - 1] > tol || nums[i][j] - nums[i - 1][j - 1] < -tol) && (nums[i][j] - nums[i + 1][j + 1] > tol || nums[i][j] - nums[i + 1][j + 1] < -tol) && (nums[i][j] - nums[i - 1][j + 1] > tol || nums[i][j] - nums[i - 1][j + 1] < -tol) && (nums[i][j] - nums[i + 1][j - 1] > tol || nums[i][j] - nums[i + 1][j - 1] < -tol)) {
//                        if (Math.abs(nums[i][j] - nums[i - 1][j]) > tol && Math.abs(nums[i][j] - nums[i + 1][j]) > tol && Math.abs(nums[i][j] - nums[i][j - 1]) > tol && Math.abs(nums[i][j] - nums[i][j + 1]) > tol && Math.abs(nums[i][j] - nums[i - 1][j - 1]) > tol && Math.abs(nums[i][j] - nums[i + 1][j + 1]) > tol && Math.abs(nums[i][j] - nums[i - 1][j + 1]) > tol && Math.abs(nums[i][j] - nums[i + 1][j - 1]) > tol) {
//                        if (map.get(nums[i][j])==1 && nums[i][j] - nums[i - 1][j] > tol && nums[i][j] - nums[i + 1][j] > tol && nums[i][j] - nums[i][j - 1] > tol && nums[i][j] - nums[i][j + 1] > tol && nums[i][j] - nums[i - 1][j - 1] > tol && nums[i][j] - nums[i + 1][j + 1] > tol && nums[i][j] - nums[i - 1][j + 1] > tol && nums[i][j] - nums[i + 1][j - 1] > tol) {
                            temp++;
                            list.add(j + 1);
                            list1.add(i + 1);
                            list2.add(nums[i][j]);
                    }
                        }
                }
            if(temp==1){
                System.out.printf("(%d, %d): %d\n",list.get(0),list1.get(0),list2.get(0));
            }else if(temp > 1){
                System.out.println("Not Unique");
            }else {
                System.out.println("Not Exist");
            }
    }
}

image.gif

相关文章
|
3月前
|
Java 数据库连接 API
Java是什么?
Java是什么?
42 0
|
11月前
|
Java
java if
if (condition) { // 如果条件为真,执行这里的代码 } else { // 如果条件为假,执行这里的代码 }
37 0
|
12月前
|
Java 程序员 编译器
初识Java 1
初识Java
39 0
|
Java C语言
零基础学java 04
零基础学java 04
52 0
|
Java
Java之“珠穆朗玛峰”
Java之“珠穆朗玛峰”
76 0
|
存储 自然语言处理 运维
JAVA问答11
JAVA问答11
94 0
|
Cloud Native Oracle Java
一篇文章和你从 Java1 聊到 Java18
002-2022 年的 20 年里 Java 始终保持在前三的水平,其中在 2005 年、2013-2015 年间、2021 年等时间还多次登顶过第一,这么一个已经发布了 27 年的语言在这些年是怎么始终保持在编程语言前三的呢?这么多年 Java 各个版本间又有什么变化?Java 语言在未来还会继续保持成为语言的常青树吗?这篇文章就来和大家回顾一下 Java 的历史。
269 0
一篇文章和你从 Java1 聊到 Java18
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
59 0
|
前端开发 Java 测试技术
关于 Java 18 你想知道的一切(中)
关于 Java 18 你想知道的一切(中)
关于 Java 18 你想知道的一切(中)
|
Java
+ 在Java中有两种使用情况
+ 在Java中有两种使用情况:
96 0