PTA刷题Basic篇——1068.万红丛中一点绿——Day(34)

题目描述

在这里插入图片描述
在这里插入图片描述
找出图中所有像素满足要求的一个像素,并输入其位置和对应像素值,如果不唯一则输出not unique,不存在输出not exist.

题目分析

我们可以使用增量数组,将某个像素8个方向的位置变化描述出来,这有点像广度优先遍历找寻小岛的问题。将8个方向描述出来后,我们就要判断某个位置是否满足要求,满足要求即这8个位置的像素点与像素点的差值都大于TOL。
我们可以看到输出中包含坐标和像素值,则我们最好声明一个结构体,包括像素点的x,y和value。这样方便运算。
我们将每个像素值出现的次数和像素值存入一个map中,像素点出现的次数必须=1才算完全满足条件。

代码

#include <iostream>
#include <vector>
#include <map>
#include <cstdio>
using namespace std;
int M,N,TOL;
vector<vector<int> > v;
int arr[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
bool judge(int i, int j)
{
    for(int k=0; k<8; k++){
        int x = i+arr[k][0];
        int y = j+arr[k][1];
        if(x>=0 && x<N && y>=0 && y<M && v[i][j]-v[x][y]>= 0-TOL && v[i][j]-v[x][y]<=TOL)
            return false;
    }
    return true;
}
int main()
{
    int count=0, posX, posY;
    cin>>M>>N>>TOL;
    v.resize(N, vector<int>(M));
    //map存的是像素值及其出现次数,出现次数为1才可
    map<int, int> Map;
    for(int i=0; i<N; i++)
 {
        for(int j=0; j<M; j++)
  {
            scanf("%d", &v[i][j]);
            Map[v[i][j]]++;
        }
    }
    for(int i=0; i<N; i++)
 {
        for(int j=0; j<M; j++)
  {
            if(Map[v[i][j]] == 1 && judge(i, j)==true)  // 只有一个符合的
   {
                count++;
                posX = i;
                posY = j;
            }
        }
    }
    if(count == 1)
 {
        printf("(%d, %d): %d", posY+1, posX+1, v[posX][posY]);
    }
 else if(count > 1)
 {
        printf("Not Unique");
    }
 else
 {
        printf("Not Exist");
    }
    return 0;
}

答题用时18min
Q68——finish√

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值