深度优先搜索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:暴力大法好!!!