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 }
默默地一点点变强,细节决定成败