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

"该程序通过读取n行m列的图像矩阵,判断每个像素点是否为唯一颜色,并检查其周围8个方向上的相邻像素,如果颜色差异不超过tol,则标记为不唯一。最终找出所有独一无二的颜色区域,若不存在则输出"NotExist",存在多个则输出"NotUnique",仅有一个则输出位置和颜色值。"
摘要由CSDN通过智能技术生成

题目链接

#include<iostream>
#include<vector>
#include<map>
using namespace std;

int m,n,tol;
vector<vector<int>> v;
int row[8]={-1,-1,-1,0,1,1,1,0}; //增量数组,左上方开始顺时针遍历
int col[8]={-1,0,1,1,1,0,-1,-1};

bool judge(int x,int y){
    for(int k=0;k<8;k++){
        int dx=x+row[k];
        int dy=y+col[k]; //(dx,dy)在图像内部且与(x,y)点色差不够
        if(dx>=0&&dx<n&&dy>=0&&dy<m&&abs(v[dx][dy]-v[x][y])<=tol) return false;  
    }
    return true;
}

int main(){
    cin>>m>>n>>tol;
    v.resize(n,vector<int>(m)); //n行m列
    map<int,int> mp; //颜色需独一无二
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>v[i][j];
            mp[v[i][j]]++;
        }
    }
    int x,y,cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[v[i][j]]==1&&judge(i,j)){
                x=i+1;
                y=j+1;
                cnt++;
            }
        }
    }
    if(cnt==0) cout<<"Not Exist"<<endl;
    else if(cnt==1) printf("(%d, %d): %d\n",y,x,v[x-1][y-1]); //注意是列、行
    else cout<<"Not Unique"<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值