PAT 1068 万绿丛中一点红

要点有2
1该点需要做到独一无二,即唯一点
2需要与相邻点的插值都超过TOL
特殊情况:边界,边界的点其相邻点总会有不存在的点,考虑到像素值都是正值,使用一个M+2,N+2的数组存储图像,这样没有存储的外圈的值应该都是-1,通过检查数组对应的值是否是-1就可以检查该像素点是否需要检查

#include <bits/stdc++.h>
using namespace std;
//要点1该点需要做到独一无二,即唯一点
//要点2 需要与相邻点的插值都超过TOL 

unordered_map <int,int> appearancetime;//标记该颜色出现次数,键值是颜色,值是出现次数 
int main(){
    int M,N,TOL;
    cin>>M>>N>>TOL;
    int image[N+2][M+2];
    //cout<<M<<N<<TOL<<endl;
    memset(image, -1, sizeof(image));
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            cin>>image[i][j];
            appearancetime[image[i][j]]++;
        }
    }
//    for(auto it=appearancetime.begin();it!=appearancetime.end();it++)
//    {
//    	cout<<it->first<<" "<<it->second<<endl;
//	}
    int xpos[1000];
    int ypos[1000];
    int cnt=0;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            if(appearancetime[image[i][j]]==1)
            {
            	//如果不存在,那么直接不检查这个点
				//如果存在,那么要检查 
                if((image[i-1][j-1]!=-1)&&abs(image[i][j]-image[i-1][j-1])<=TOL) continue; //左上 
                if((image[i-1][j]!=-1)&&abs(image[i][j]-image[i-1][j])<=TOL) continue; //正左 
				if((image[i][j-1]!=-1)&&abs(image[i][j]-image[i][j-1])<=TOL) continue;//正上 
				if((image[i-1][j+1]!=-1)&&abs(image[i][j]-image[i-1][j+1])<=TOL) continue;//左下 
				if((image[i][j+1]!=-1)&&abs(image[i][j]-image[i][j+1])<=TOL) continue;//正下 
				if((image[i+1][j-1]!=-1)&&abs(image[i][j]-image[i+1][j-1])<=TOL) continue; //右上 
				if((image[i+1][j]!=-1)&&abs(image[i][j]-image[i+1][j])<=TOL) continue; // 正右 
				if((image[i+1][j+1]!=-1)&&abs(image[i][j]-image[i+1][j+1])<=TOL)  continue;// 右下 
				else
				{
					xpos[cnt]=i;
                	ypos[cnt]=j;
                	cnt++;
				}
            }
            
        }
    }
    if(cnt==0) printf("Not Exist");
    else if(cnt==1)
    printf("(%d, %d): %d",ypos[0],xpos[0],image[xpos[0]][ypos[0]]);
    else
    printf("Not Unique");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值