题目大意:求矩阵中块的个数
如6*7矩阵:
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
此矩阵中 块“1”的个数为4。
- 给出DFS做法
1 #include<bits/stdc++.h>
2 using namespace std;
3 int m,n;//m行n列
4 bool visit[20][20]=false;
5 int map_[20][20]={0};
6 void DFS(int x,int y){
7 int next[4][2]={0,1,0,-1,1,0,-1,0};//四个方向
8 for(int i=0;i<4;i++){
9 int tx=x+next[i][0];
10 int ty=y+next[i][1];
11 if(visit[tx][ty]==true||tx<1||ty<1||tx>m||ty>n) continue;//剪枝
12 if(visit[tx][ty]==false&&map_[tx][ty]==1){
13 visit[tx][ty]=true;
14 DFS(tx,ty);
15 }
16 }
17 }
18 int main(){
19 while(cin>>m>>n){
20 memset(visit,false,sizeof(visit));
21 memset(map_,0,sizeof(map_));
22 for(int i=1;i<=m;i++){
23 for(int j=1;j<=n;j++){
24 cin>>map_[i][j];//初始化地图
25 }
26 }
27 int cnt=0;
28 for(int i=1;i<=m;i++){
29 for(int j=1;j<=n;j++){
30 if(visit[i][j]==false&&map_[i][j]==1){
31 //如果未被访问到 并且是能访问到的地方
32 cnt++;
33 DFS(i,j);
34 }
35 }
36 }
37 cout<<cnt<<endl;
38 }
39 return 0;
40 }
1 #include<bits/stdc++.h>
2 using namespace std;
3
4 const int maxn=20;
5 bool inqueue[maxn][maxn]={false};
6 int m,n;
7 int map_[maxn][maxn]={0};
8 int next[4][2]={0,1,1,0,0,-1,-1,0};//4个方向
9 struct Point{
10 int x;
11 int y;
12 Point(int c,int d):x(c),y(d){}
13 };
14
15 void BFS(int x,int y){
16 queue<Point>q ;
17 q.push(Point(x,y));//将节点入队
18 inqueue[x][y]=true;//标记已经入过队
19 while(!q.empty()){
20 Point top=q.front();
21 q.pop();
22 for(int i=0;i<4;i++){
23 int tx=top.x+next[i][0];
24 int ty=top.y+next[i][1];
25 //如果超过边界;不能访问到;已经入队过 ---那么就跳过。
26 if(tx<1||ty<1||tx>m||ty>n||map_[tx][ty]==0||inqueue[tx][ty]==true) continue;
27 //否则---剩下的是合法的能访问到的
28 inqueue[tx][ty]=true;//标记入队
29 q.push(Point(tx,ty));
30 }
31 }
32 }
33
34 int main(){
35 while(cin>>m>>n){
memset(map_,0,sizeof(map_));
38 memset(inqueue,false,sizeof(inqueue));
39 for(int i=1;i<=m;i++){
40 for(int j=1;j<=n;j++){
41 cin>>map_[i][j];//初始化地图
42 }
43 }
44 int cnt=0;
45 for(int i=1;i<=m;i++){
46 for(int j=1;j<=n;j++){
47 if(inqueue[i][j]==false&&map_[i][j]==1){
48 //如果未被访问到 并且是能访问到的地方
49 cnt++;
50 BFS(i,j);
51 }
52 }
53 }
54 cout<<cnt<<endl;
55 }
56 return 0;
57 }
===================================================================================
- 2014北邮考研机试题目
- Problem C. 图像识别
题目描述
在图像识别中,我们经常需要分析特定图像中的一些特征,而其中很重要的一点就是识别出图像的多个区域。在这个问题中,我们将给定一幅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<=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 - 能够看出 此题和上题大同小异,下面给出DFS做法~
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=105;
4 int n,m,d;
5 int map_[maxn][maxn]={0};
6 bool visit[maxn][maxn]={false};
7 int next[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
8 void DFS(int x,int y){
9 for(int i=0;i<8;i++){
10 int tx=x+next[i][0];
11 int ty=y+next[i][1];
12 if(tx<0||ty<0||tx>n-1||ty>m-1||visit[tx][ty]==true) continue;
13 if(visit[tx][ty]==false&&abs(map_[x][y]-map_[tx][ty])<=d){
14 visit[tx][ty]=true;//找到同一区域其他点并标记。
15 DFS(tx,ty);
16 }
17 }
18 }
19 int main(){
20 int T;
21 cin>>T;
22 while(T--){
23 memset(map_,0,sizeof(map_));
24 memset(visit,false,sizeof(visit));
25 cin>>n>>m>>d;
26 for(int i=0;i<n;i++){
27 for(int j=0;j<m;j++){
28 cin>>map_[i][j];
29 }
30 }//初始化地图
31 int cnt=0;
32 for(int i=0;i<n;i++){
33 for(int j=0;j<m;j++){
34 if(visit[i][j]==false){
35 visit[i][j]=true;
36 DFS(i,j);//找到同一区域其他点并标记。
37 /*
38 for(int i=0;i<n;i++){
39 for(int j=0;j<m;j++){
40 cout<<visit[i][j]<<' ';
41 }
42 cout<<endl;
43 }
44 cout<<endl;
45 */
46 cnt++;//区域个数加1.
47 }
48 }
49 }
50 cout<<cnt<<endl;
51 }
52 return 0;
53 }