PAT-B 1068. 万绿丛中一点红(20)

传送门

https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184

题目

对于计算机而言,颜色不过是像素点对应的一个24位的数值。现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围8个相邻像素的颜色差充分大。
输入格式:
输入第一行给出三个正整数,分别是M和N(<= 1000),即图像的分辨率;以及TOL,是所求像素点与相邻点的颜色差阈值,色差超过TOL的点才被考虑。随后N行,每行给出M个像素的颜色值,范围在[0, 224)内。所有同行数字间用空格或TAB分开。
输出格式:
在一行中按照“(x, y): color”的格式输出所求像素点的位置以及颜色值,其中位置x和y分别是该像素在图像矩阵中的列、行编号(从1开始编号)。如果这样的点不唯一,则输出“Not Unique”;如果这样的点不存在,则输出“Not Exist”。
输入样例1:
8 6 200
由于这里不直观,直接放个表格上来:

0 0 0 0 0 0 0 0
65280 65280 65280 16711479 65280 65280 65280 65280
16711479 65280 65280 65280 16711680 65280 65280 65280
65280 65280 65280 65280 65280 65280 165280 165280
65280 65280 16777015 65280 65280 165280 65480 165280
16777215 16777215 16777215 16777215 16777215 16777215 16777215 16777215

输出样例1:
(5, 3): 16711680
输入样例2:
4 5 2
0 0 0 0
0 0 3 0
0 0 0 0
0 5 0 0
0 0 0 0
输出样例2:
Not Unique
输入样例3:
3 3 5
1 2 3
3 4 5
5 6 7
输出样例3:
Not Exist

分析

很烦的一题,改了好多次都没过,参考了各种代码,最后才知道坑在哪里,下面让我来简单说一下。

首先要写个判断“一点红”的函数,我那个方法写的很直观很好懂(其实是有点low,哈哈人艰不拆)。

接着要有一个判重的方法来判断数字是否重复,如果不重复并且满足“一点红”的条件才符合。

此条见题中原句:

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

觉得好坑是吗?是的,跟上我的脚步,后面还有更坑的。

代码写到目前为止,我天真的以为应该就可以A了,但是我万万没想到的是,问题出在了我的遍历方法。

刚才的题目中提到“周围8个相邻像素的颜色”,所以我很自然认为,最上、最左、最右、最下这四列,由于附近的像素构成不了8个,故舍去,但是这样的结果是两个检查点通过不了。

参考了网上各类代码后,发现成功的解法与我的解法的差别就在于对四个边元素的验证,只要对其进行验证,题目就能A掉,于是我给输入的数组四周补上了0,然后将四个边上的数也进行验证后,就通过了这道题,类似下图。

0 0 0 0 0
0 x x x 0
0 x x x 0
0 x x x 0
0 0 0 0 0

这就是我解题时遇到的各种问题,希望能解决大家的疑问。

源代码

//C/C++实现
#include <iostream>
#include <vector>
#include <cmath>
#include <map>

using namespace std;

bool isRed(int i, int j, vector<vector<int> > v, int tol){
    if (abs(v[i - 1][j - 1] - v[i][j]) <= tol){ // 左上角
        return false;
    }
    if (abs(v[i][j - 1] - v[i][j]) <= tol){ // 上
        return false;
    }
    if (abs(v[i + 1][j - 1] - v[i][j]) <= tol){ // 右上角
        return false;
    }
    if (abs(v[i + 1][j] - v[i][j]) <= tol){ // 右
        return false;
    }
    if (abs(v[i + 1][j + 1] - v[i][j]) <= tol){ // 右下角
        return false;
    }
    if (abs(v[i][j + 1] - v[i][j]) <= tol){ // 下
        return false;
    }
    if (abs(v[i - 1][j + 1] - v[i][j]) <= tol){ // 左下角
        return false;
    }
    if (abs(v[i - 1][j] - v[i][j]) <= tol){ // 左
        return false;
    }
    return true;
}

vector<vector<int> > v;

int main(){
    int m, n, tol;
    scanf("%d %d %d", &m, &n, &tol);
    // n行m列二维数组
    v.resize(n + 2);
    for (int i = 0; i < n + 2; ++i){
        v[i].resize(m + 2);
    }
    map<int, int> isRepeat;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            scanf("%d", &v[i][j]);
            ++isRepeat[v[i][j]];
        }
    }
    int cnt = 0;
    int resI, resJ;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= m; ++j){
            if (isRepeat[v[i][j]] == 1){ // 只出现过一次
                if (isRed(i, j, v, tol)){
                    ++cnt;
                    resI = i;
                    resJ = j;
                    if (cnt == 2){
                        break;
                    }
                }
            }
        }
        if (cnt == 2){
            break;
        }
    }
    if (cnt == 0){
        printf("Not Exist\n");
    }
    else if (cnt == 1){
        printf("(%d, %d): %d\n", resJ, resI, v[resI][resJ]);
    }
    else if (cnt == 2){
        printf("Not Unique\n");
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容