首页 > 其他 > 详细

PAT(Basic Level) Practice : 1068 万绿丛中一点红 (20分)

时间:2020-09-29 23:25:28      阅读:50      评论:0      收藏:0      [点我收藏+]

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

思路

两个要点
1.四周一圈都要比较,大于tol
2.颜色要唯一
思路:
1.先把每个像素点的颜色都存起来,排个序。
2.对每个像素点的一周的像素比较,找出符合要求的点,存到一个vector中
3.对该vector的每个像素点的颜色去查找有无重复的,如果没有就是符合要求的点。
具体来说就是先根据颜色找到第一个索引,看下一个颜色是否相同,相同就说明这个颜色不是唯一的。

代码

#include <iostream>
#include <vector>
#include <string>
#include <cstdio>
//scanf printf防止超时
#include <algorithm>
//vector的sort
#include <sstream>
//转换
using namespace std;

#include<iomanip>
//精度

#include<cmath>
//round四舍五入取整
class point
{
public:
    int x;
    int y;
    int color;
};
int photo[1001][1001]={-1};

int main()
{

    int m,n,tol;
    cin>>m>>n>>tol;
    vector<int> colors;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int color;
            scanf("%d",&color);
            photo[i][j]=color;
            colors.push_back(color);
        }
    }


    vector<point> points;
    for(int i=1;i<n;i++)
    {
        for(int j=1;j<m;j++)
        {
            bool flag=true;
            if(j>1)
            {
                if(abs(photo[i][j]-photo[i][j-1])<=tol)
                    flag=false;
            }
            if(i>1)
            {
                if(abs(photo[i][j]-photo[i-1][j])<=tol)
                    flag=false;
            }
            if(j<m)
            {
                if(abs(photo[i][j]-photo[i][j+1])<=tol)
                    flag=false;
            }
            if(i<n)
            {
                if(abs(photo[i][j]-photo[i+1][j])<=tol)
                    flag=false;
            }

            if(i>1&&j>1)
            {
                if(abs(photo[i][j]-photo[i-1][j-1])<=tol)
                    flag=false;
            }
            if(i>1&&j<m)
            {
                if(abs(photo[i][j]-photo[i-1][j+1])<=tol)
                    flag=false;
            }
            if(i<n&&j<m)
            {
                if(abs(photo[i][j]-photo[i+1][j+1])<=tol)
                    flag=false;
            }
            if(i<n&&j>1)
            {
                if(abs(photo[i][j]-photo[i+1][j-1])<=tol)
                    flag=false;
            }
            if(flag)
            {
                point p;
                p.x=i;
                p.y=j;
                p.color=photo[i][j];
                points.push_back(p);
                //printf("(%d, %d): %d\n",p.x,p.y,p.color);
            }
        }
    }


    sort(colors.begin(),colors.end());

    vector<point> res;
    for(int i=0;i<points.size();i++)
    {
        int index;
        for(int j=0;j<colors.size();j++)
        {
            if(colors[j]==points[i].color)
            {
                index=j;
                break;
            }
        }
        bool flag=true;
        if(index<colors.size()-1)
        {
            if(colors[index+1]==points[i].color)
                flag=false;
        }
        if(flag)
            res.push_back(points[i]);
    }



    int count=res.size();
    if(count==0)
    {
        cout<<"Not Exist"<<endl;
    }else if(count==1)
    {
        printf("(%d, %d): %d\n",res[0].y,res[0].x,res[0].color);
    }else
    {
        cout<<"Not Unique"<<endl;
    }
    return 0;
}

PAT(Basic Level) Practice : 1068 万绿丛中一点红 (20分)

原文:https://www.cnblogs.com/zchq/p/13751722.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!