PAT 乙级 1068 万绿丛中一点红(20 分)
1068 万绿丛中一点红(20 分)
对于计算机而言,颜色不过是像素点对应的一个 24 位的数值。现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 8 个相邻像素的颜色差充分大。
输入格式:
输入第一行给出三个正整数,分别是 M 和 N(≤ 1000),即图像的分辨率;以及 TOL,是所求像素点与相邻点的颜色差阈值,色差超过 TOL 的点才被考虑。随后 N 行,每行给出 M 个像素的颜色值,范围在 [0,224) 内。所有同行数字间用空格或 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 }