B1068. 万绿丛中一点红(20)。。。map的运用

对于计算机而言,颜色不过是像素点对应的一个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

#include 
#include 
#include
#include
using namespace std;

int in[1005][1005] = { 0 };
map<int, int> vis;
int col, row, TOL;
int x = -1, y = -1;
int cnt = 0;


int main()
{
    cin >> col >> row >> TOL;
    for(int i=0;ifor (int j = 0; j < col; ++j)
        {
            cin >> in[i][j];
            vis[in[i][j]] ++;
        }
    //处理
    for (int i = 0; i < row; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            if (vis[in[i][j]] == 1)
            {
                //左上开始,顺时针
                if (i - 1 >= 0 && j - 1 >= 0)//左上
                {
                    if (abs(in[i][j] - in[i - 1][j - 1]) <= TOL)
                        continue;
                }
                if (i - 1 >= 0)              //上
                {
                    if (abs(in[i][j] - in[i - 1][j]) <= TOL)
                        continue;
                }
                if (i - 1 >= 0 && j + 1 < col)  //右上
                {
                    if (abs(in[i][j] - in[i - 1][j + 1]) <= TOL)
                        continue;
                }
                if (j + 1 < col)              //右
                {
                    if (abs(in[i][j] - in[i][j + 1]) <= TOL)
                        continue;
                }
                if (i + 1 < row && j + 1 < col)//右下
                {
                    if (abs(in[i][j] - in[i + 1][j + 1]) <= TOL)
                        continue;
                }
                if (i + 1 < row)              //下
                {
                    if (abs(in[i][j] - in[i + 1][j]) <= TOL)
                        continue;
                }
                if (i + 1 < row && j - 1 >= 0)//左下
                {
                    if (abs(in[i][j] - in[i + 1][j - 1]) <= TOL)
                        continue;
                }
                if (j - 1 >= 0)              //左
                {
                    if (abs(in[i][j] - in[i][j - 1]) <= TOL)
                        continue;
                }
                x = i;
                y = j;
                ++cnt;
            }
        }
    }
    if (cnt == 0)
        cout << "Not Exist";
    else if (cnt == 1)
        printf("(%d, %d): %d", y + 1, x + 1, in[x][y]);
    else
        printf("Not Unique");

    system("pause");
    return 0;
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
注意点:
//——————–1、独特性—————————–//
“现给定一幅分辨率为MxN的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点”
这意味着
形如下面的输入:
5 5 1
0 0 0 0 0
0 0 5 5 0
0 0 0 0 0
0 5 0 0 0
0 0 0 0 0
输出:
Not Exist
因为5并不是独一无二的。
//——————–2、边缘情况—————————–//
案例输入:
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
一开始以为第三行第一列的16711479被排除是因为位列边缘,因为不满足“该点的颜色与其周围8个相邻像素的颜色差充分大”,边缘像素它没有8个相邻像素,但是参考了前辈代码发现,这个像素被排除是因为这个数字在其他位置也出现了,而不是因为它没有8个相邻像素。
对于这个边缘像素,就不需要考虑它的左上,左,左下,默认通过了。
//——————–3、绝对值—————————–//
案例输入:
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
2行4列的“16711479”与3行5列的”16711680”。
一开始,我没有考虑独特性的时候,在想为什么“16711479”就不符合,而”16711680”就符合了,
“是所求像素点与相邻点的颜色差阈值,色差超过TOL的点才被考虑。”
在看到上面这句话,我以为16711479-16711680=-201,不大于200,所以被排除。
考虑独特性后,没有abs函数,测试点3显示”答案错误“。
而加上abs函数,便显示”答案正确“。
因此我认为上述那句话有歧义,甩锅给出题人。[奸笑]
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
代码的cnt==2后,就可以跳出循环了,没必要继续统计下去,有兴趣的童鞋可以自己改改
参考代码:http://blog.csdn.net/qq_34594236/article/details/63692920
要学习一波map了,感觉挺好用的。

你可能感兴趣的:(题目类一一PAT乙级)