深度优先搜索DFS---求出矩阵中“块”的个数。

题目:

  给出一个 m x n 的矩阵,矩阵中的元素为0或1。如果矩阵中有若干个 1是相邻的,那么称这些1构成了一个“块”。求给定的矩阵中“块”的个数。

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

例如上面的 6 x 7的矩阵中,“块”的个数为4。

输入格式:

第一行给出 m,n(1<=m,n<= 20)分别表示矩阵的行,列。

每一行给出 n个数(0或者1),共m行。

输出格式:

输出矩阵中“块”的个数。

输入样例:

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

输出样例:

4

直接上代码。。。

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxn = 100;
 5 int matrix[maxn][maxn];
 6 int m,n,CNT = 0;
 7 
 8 void DFS(int i, int j) {
 9     if(i < 0 || j < 0 || i >= m || j>= n || matrix[i][j] == 0)//不能逾越矩阵边界,或者元素为 0---即递归边界 
10         return ;
11     //右下左上,作为四个选择分支
12     matrix[i][j] = 0;//访问的元素 1,置为 0 
13     DFS(i,j+1);//
14     DFS(i+1,j);//
15     DFS(i,j-1);//
16     DFS(i-1,j);//
17 }
18 
19 int main() {
20     cin>>m>>n;
21     for(int i = 0; i < m; ++i) { //初始化矩阵
22         for(int j = 0; j < n; ++j)
23             cin>>matrix[i][j];
24     }
25     for(int i = 0; i < m; ++i) {//暴力DFS,哈哈哈 
26         for(int j = 0; j < n; ++j) {
27             if(matrix[i][j] == 1) {
28                 DFS(i,j);
29                 CNT++;
30             }
31         }
32     }
33     cout<<CNT;//输出矩阵中”块“ 的个数 
34     return 0;
35 }

运行结果:

 

 PS:暴力大法好!!!

 

posted @ 2020-02-27 13:38  tangq123  阅读(533)  评论(0编辑  收藏  举报