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

 本题的输入不要用cin,要用scanf,否则会有测试点4的超时

思路:利用map来存储每个像素点出现的次数,judge函数判断与周围八个像素点的色差阈值是否超过TOL,输入时让每个像素点的出现次数做累加,方便之后判断本像素点是否是只出现过一次的(输入样式1中,16711479超过了色差阈值,但是有两个16711479,不符合),对每个像素点进行遍历,如果只出现过一次且与周围八个点的色差超过TOL,则flag++(独一无二的像素点),若只有一个这样的像素点(falg == 1),则输出他的(x,y)(编号从1开始算起),若没有这样的像素点(flag == 0),则输出 Not Exist,若有超过1个这样的像素点(flag >= 2),则输出Not Unique

 1 #include<iostream>
 2 #include<map>
 3 
 4 using namespace std;
 5 
 6 /*所有像素点*/
 7 int px[1002][1002] = { 0 };                            
 8 
 9 int judge(int i, int j, int tol) {                    //八个位置的判断
10     if ((abs(px[i][j] - px[i][j + 1]) > tol) &&
11         (abs(px[i][j] - px[i][j - 1]) > tol) &&
12         (abs(px[i][j] - px[i + 1][j]) > tol) &&
13         (abs(px[i][j] - px[i - 1][j]) > tol) &&
14         (abs(px[i][j] - px[i - 1][j - 1]) > tol) &&
15         (abs(px[i][j] - px[i - 1][j + 1]) > tol) &&
16         (abs(px[i][j] - px[i + 1][j - 1]) > tol) &&
17         (abs(px[i][j] - px[i + 1][j + 1]) > tol))
18         return 1;
19     return 0;
20 }
21 
22 int main() {
23     int n = 0, m = 0, tol = 0;
24     /*输出标志位*/
25     int flag = 0;
26     map<int, int> unique;                //map<key,值>来存储每个像素点的出现次数
27     /*行,列*/
28     int h = 0, l = 0;
29     scanf("%d %d %d", &m, &n, &tol);
30     for (int i = 1; i <= n; ++i)
31         for (int j = 1; j <= m; ++j) {
32             scanf("%d", &px[i][j]);
33             unique[px[i][j]]++;            //像素点出现次数累加
34         }
35     for (int i = 1; i <= n; ++i) {
36         for (int j = 1; j <= m; ++j) {
37             if (unique[px[i][j]] == 1 && judge(i, j, tol)) {        //像素点只出现过一次,且超过色差范围
38                 flag++;
39                 h = i;
40                 l = j;
41             }
42         }
43     }
44     if (flag == 1)      printf("(%d, %d): %d", l, h, px[h][l]);
45     else if (flag == 0) cout << "Not Exist";
46     else                cout << "Not Unique";
47     return 0;
48 }

原文地址:https://www.cnblogs.com/SCP-514/p/13625802.html