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

题目:

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

输入格式:

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

输出格式:

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

题目分析:越来越读不懂题目啦~要求是一个独一无二的数,并且还满足与8个数之差大于某个值

#include<iostream>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
bool eight(vector<vector<int>>v,int i,int j,int k,int n,int m){
    if(i-1>=0){
        if(j-1>=0) if(abs(v[i-1][j-1]-v[i][j])<=k) return false;
        if(abs(v[i-1][j]-v[i][j])<=k) return false;
        if(j+1<m) if(abs(v[i-1][j+1]-v[i][j])<=k) return false;
    }
    if(j-1>=0) if(abs(v[i][j-1]-v[i][j])<=k) return false; 
    if(j+1<m) if(abs(v[i][j+1]-v[i][j])<=k) return false; 
    if(i+1<n) {
        if(j-1>=0) if(abs(v[i+1][j-1]-v[i][j])<=k) return false;
        if(abs(v[i+1][j]-v[i][j])<=k) return false;
        if(j+1<m) if(abs(v[i+1][j+1]-v[i][j])<=k) return false;
    }
    return true;
}
int main(){
    int n,m,shuzhi;
    int x,y,shu;
    int num=0;
    cin>>m>>n>>shuzhi;
    map<int,int>vis;
    vector<vector<int>>v(n);
    for(int i=0;i<n;i++){
         for(int j=0;j<m;j++){
             int d;cin>>d;
             v[i].push_back(d);
             vis[d]++;
         }
    }
 for(int i=0;ai<n;i++)
        for(int j=0;j<m;j++)
            if(vis[v[i][j]]==1&&eight(v,i,j,shuzhi,n,m)==true) {
                num++;
                x=j+1;
                y=i+1;
                shu=v[i][j];
            }
    if(num==1) printf("(%d, %d): %d\n",x,y,shu);
    else if(num==0) cout<<"Not Exist\n";
    else cout<<"Not Unique\n";
}
上一篇:bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成


下一篇:一步一步解析H.264码流的NALU(SPS,PSS,IDR)获取宽高和帧率