BFS图像识别问题(北邮OJ上的一个题目)
一、问题描述:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int MAXN=105;
int n,m,d;
int X[8]={-1,-1,-1,0,0,1,1,1};
int Y[8]={-1,0,1,-1,1,-1,0,1}; //周围8个方向的点
bool visit[MAXN][MAXN]={false};
int matrix[MAXN][MAXN];
struct Node{ //坐标的结构体
int x;
int y;
};
Node tmp;
bool Judge(int x,int y){
if(x<0||x>=n||y<0||y>=m){ //越界
return false;
}
if(visit[x][y]==true){ //已经进队
return false;
}
return true;
}
void BFS(int x,int y){
queue<Node>Q;
tmp.x=x; //使用了queue容器,进队的是元素副本,因此让编号入队
tmp.y=y;
Q.push(tmp); //也可以在结构体内重写同名函数赋值
visit[x][y]=true;
while(!Q.empty()){
Node top=Q.front();
Q.pop();
for(int i=0;i<8;++i){
int newX=top.x+X[i];
int newY=top.y+Y[i];//遍历周围8个节点
int diff=abs(matrix[newX][newY]-matrix[top.x][top.y]);//像素差值
if(Judge(newX,newY)&&diff<=d){ //满足在图像内且像素差满足条件
tmp.x=newX;
tmp.y=newY;
Q.push(tmp);//将该点入队
visit[newX][newY]=true;//入队后设置入队标志数组为false
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int ans=0;
scanf("%d%d%d",&n,&m,&d);
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
scanf("%d",&matrix[i][j]);
}
} //输入图像
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(!visit[i][j]){ //依次遍历每个点
BFS(i,j);
ans++; //每做一次BFS图形块数加1
}
}
}
memset(matrix,0,sizeof(matrix));
memset(visit,false,sizeof(visit)); //多组数据每次做恢复初始值操作
printf("%d\n",ans);}
return 0;
}
参考:《算法笔记》BFS的算法