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

Posted cdp1591652208

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 乙级 1068 万绿丛中一点红(20 分)相关的知识,希望对你有一定的参考价值。

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

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

输入格式:

输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,2?24??) 内。所有同行数字间用空格或 TAB 分开。

输出格式:

在一行中按照 (x, y): color 的格式输出所求像素点的位置以及颜色值,其中位置 x 和 y 分别是该像素在图像矩阵中的列、行编号(从 1 开始编号)。如果这样的点不唯一,则输出 Not Unique;如果这样的点不存在,则输出 Not Exist

 

注意:1.该像素一定是独一无二的

   2.本题中有一测试例输入数量很大,所以使用cin时会导致运行超时,解决方法1.加上  ios::sync_with_stdio(false);  关闭cin cout的输入输出缓冲区加快输入输出效率,2.改用scanf输入

    经测试只用cin 会超时,用scanf会过测试例,使用解决方法1更快

 

 1 #include<iostream>
 2 #include<cmath>
 3 #include<map>
 4 
 5 using namespace std;
 6 
 7 int pixel[1010][1010];
 8 int col, row, tol;
 9 map<int, int> m;
10 int index[8][2] = { { -1, -1 }, { 0, -1 }, { 1, -1 }, { -1, 0 }, { 1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 } };
11 
12 bool judge(int i, int j)
13 {
14     for (int k = 0; k < 8; ++k)
15     {
16         int x = index[k][0]+i, y = index[k][1]+j;
17 
18         if (x >= 1 && x<=row && y>=1 && y<=col && abs(pixel[i][j] - pixel[x][y]) <= tol)
19             return false;
20     }
21 
22     return true;
23 }
24 
25 int main()
26 {
27     //关闭输入输出流的缓冲区,加快cin cout的速度
28     ios::sync_with_stdio(false);
29     int pointNum = 0;
30     int x, y;
31     cin >> col >> row >> tol;
32 
33     for (int i = 1; i <= row; ++i)
34     for (int j = 1; j <= col; ++j)
35     {
36         cin>> pixel[i][j];
37         ++m[pixel[i][j]];
38     }
39 
40     for (int i = 1; i <= row; ++i)
41     for (int j = 1; j <= col; ++j)
42     {
43         if (m[pixel[i][j]] == 1 && judge(i, j))
44         {
45                 ++pointNum;
46                 x = i;
47                 y = j;
48 
49                 if (pointNum == 2)//后续无须再检查,结果必定是不唯一
50                 {
51                     cout << "Not Unique" << endl;
52                     return 0;
53                 }
54         }    
55     }
56 
57     if (pointNum == 0)
58         cout << "Not Exist" << endl;
59     else if (pointNum == 1)
60         cout << "(" << y << ", " << x << "): " << pixel[x][y] << endl;
61 
62     return 0;
63 }

 

以上是关于PAT 乙级 1068 万绿丛中一点红(20 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1068

PTA乙级 (1068 万绿丛中一点红 (20分)(map))

PAT 1068. 万绿丛中一点红

1068 万绿丛中一点红 (20 分)(1.大数组放main外,防止爆栈 2.手动“外围包裹”一层补齐)

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

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