正文
PAT Basic 1068
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
1068 万绿丛中一点红
对于计算机而言,颜色不过是像素点对应的一个 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:
输出样例 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题解:这道题显然用set可以比较方便的出来,但是不用set也可以做。代码如下:
#include<iostream>
#include<math.h>
#include<set>
#define N 1000 using namespace std; long int a[][N];
int b[][N] = {}; int main()
{
int m, n, num = , p, q, ac;
long int answer,tol,x;
scanf("%d %d %ld",&m,&n,&tol);
for( int i = ; i <= n; i++){
for( int j = ; j <= m; j++){
if( i == || j == ) a[i][j] = -;
else{
scanf("%ld",&x);
a[i][j] = x;
}
}
} for( int i = ; i <= n; i++){
for( int j = ; j <= n; j++){
if( b[i][j] == ) continue;
if( fabs(a[i][j] - a[i][j-]) <= tol && a[i][j-] != -) continue;
if( fabs(a[i][j] - a[i][j+]) <= tol && a[i][j+] != -) continue;
if( fabs(a[i][j] - a[i-][j]) <= tol && a[i-][j] != -) continue;
if( fabs(a[i][j] - a[i+][j]) <= tol && a[i+][j] != -) continue;
if( fabs(a[i][j] - a[i-][j-]) <= tol && a[i-][j-] != -) continue;
if( fabs(a[i][j] - a[i-][j+]) <= tol && a[i-][j+] != -) continue;
if( fabs(a[i][j] - a[i+][j-]) <= tol && a[i+][j-] != -) continue;
if( fabs(a[i][j] - a[i+][j+]) <= tol && a[i+][j+] != -) continue;
ac = ;
for( int i1 = ; i1 <= n; i1++ ){
for( int j1 = ; j1 <= m; j1++){
if(i1==i && j1 == j) continue;
else{
if(a[i1][j1] == a[i][j]){
ac = ;
break;
}
}
}
if(!ac) break;
}
if(!ac) continue;
p = i;
q = j;
answer = a[i][j];
num++;
if(num > )
break;
}
if( num >)
break;
}
if(num > )
printf("Not Unique");
if( num == )
printf("(%d, %d): %lld",q,p,answer);
if( num == )
printf("Not Exist"); return ;
}