假设我们有一个2D二进制矩阵,其中1代表一个通讯塔,0代表一个空单元。塔可以通过以下方式进行通信:1.如果塔A和塔B在同一行或同一列上,则它们可以彼此通信。2.如果塔A可以与塔B对话,而B可以与C对话,那么A可以与C对话(传递属性)。我们必须找到那里的塔组总数(这里的一组是可以互相交谈的塔的列表)。
所以,如果输入像
1 | 1 | 0 |
0 | 0 | 1 |
1 | 0 | 1 |
为了解决这个问题,我们将按照以下步骤操作:
定义一个函数dfs()
,它将采用一个2D数组矩阵,即i,j,n,m,
矩阵[i,j]:= 2
对于初始化k:= 1,当k <n时,更新(将k增加1),执行:
dfs(矩阵,p,q,n,m)
p:=(i + k)mod n
q:= j
如果matrix [p,q]与1相同,则:
对于初始化k:= 1,当k <m时,更新(将k增加1),执行:
dfs(矩阵,p,q,n,m)
p:=我
q =(j + k)
如果matrix [p,q]与1相同,则:
从主要方法执行以下操作:
n:=矩阵大小
回答:= 0
对于初始化i:= 0,当i <n时,更新(将i增加1),请执行以下操作:
如果matrix [i,j]与1相同,则:
(将ans增加1)
dfs(矩阵,i,j,n,m)
对于初始化j:= 0,当j <m时,更新(将j增加1),请执行以下操作:
返回ans
让我们看下面的实现以更好地理解:
#include <bits/stdc++.h> using namespace std; class Solution { public: void dfs(vector<vector<int>>& matrix, int i, int j, int& n, int& m) { matrix[i][j] = 2; for (int k = 1; k < n; k++) { int p = (i + k) % n, q = j; if (matrix[p][q] == 1) dfs(matrix, p, q, n, m); } for (int k = 1; k < m; k++) { int p = i, q = (j + k) % m; if (matrix[p][q] == 1) dfs(matrix, p, q, n, m); } } int solve(vector<vector<int>>& matrix) { int n = matrix.size(), m = matrix[0].size(); int ans = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] == 1) { ans++; dfs(matrix, i, j, n, m); } } } return ans; } }; int solve(vector<vector<int>>& matrix) { return (new Solution())->solve(matrix); } main(){ vector<vector<int>> v = { {1,1,0}, {0,0,1}, {1,0,1} }; cout << solve(v); }
{{1,1,0}, {0,0,1}, {1,0,1}};
输出结果
1