题目描述:
在图像识别中,我们经常需要分析特定图像中的些特征,而其中很重要的一 点就是识别出图像的多个区域。在这个问题中,我们将给定- -幅N x M的图像,其 中每个1 x 1的点都用一个[0, 255]的值来表示他的RGB颜色。如果两个相邻的像素点颜色差值不超过D,我们就认为这两个像素点属于同一个区域。对于一一个像素点(x,y),以下这8个点(如果存在)是与它相邻的:
(x一1,y一1),(x- 1,y),(x -1,y + 1),(x,y- 1),(x,y + 1),(x + 1,y一1),(x +1,y),(x+ 1,y+ 1)。 你的任务是写一一个程序,分辨出给定图像中一“共被 分为多少个区域。
输入格式: .
输入数据包含多组测试数据。 输入的第一-行是-一个整数T (T s 100),表示测试数据的组数。 每组测试数据的第一行是三个整数N,M,D(1≤N,M≤100, 0≤D≤255),意 义如上所述。 接下来N行,每行M个整数,表示给定图像的每个像素点颜色。
输出格式:
对于每组测试数据输出-一行,即图像甲的这域数量。
输入样例:
2
3 3 0
1 1 1
0 1 0
0 1 0
3 4 1
10 11 12 13
9 8 7 6
2 3 4 5
输出样例:
3
1
#include<bits/stdc++.h>
using namespace std;
int d;
int T,N,M;
int data[105][105];
int flag[105][105];
void dfs(int x,int y,int value) {
if(x>0&&y>0&&x<=N&&y<=M) {
if(flag[x][y]==0&&abs(data[x][y]-value)<=d) {
flag[x][y]=1;
dfs(x-1,y-1,data[x][y]);
dfs(x+1,y-1,data[x][y]);
dfs(x-1,y+1,data[x][y]);
dfs(x+1,y+1,data[x][y]);
dfs(x,y-1,data[x][y]);
dfs(x,y+1,data[x][y]);
dfs(x-1,y,data[x][y]);
dfs(x+1,y,data[x][y]);
}
}
}
int main() {
cin>>T;
while(T--) {
cin>>N>>M>>d;
memset(data,0,sizeof(data));
memset(flag,0,sizeof(flag));
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
cin>>data[i][j];
}
}
int count=0;
for(int i=1; i<=N; i++) {
for(int j=1; j<=M; j++) {
if(flag[i][j]==0) {
dfs(i,j,data[i][j]);
count++;
}
}
}
cout<<count<<endl;
}
}
来源:CSDN
作者:July_zh
链接:https://blog.csdn.net/chaokudeztt/article/details/104789208