程序在C ++中查找通讯塔中的最小组数?
假设我们有一个2D二进制矩阵,其中1代表一个通讯塔,0代表一个空单元。塔可以通过以下方式进行通信:1.如果塔A和塔B在同一行或同一列上,则它们可以彼此通信。2.如果塔A可以与塔B对话,而B可以与C对话,那么A可以与C对话(传递属性)。我们必须找到那里的塔组总数(这里的一组是可以互相交谈的塔的列表)。
所以,如果输入像
为了解决这个问题,我们将按照以下步骤操作:
定义一个函数dfs(),它将采用一个2D数组矩阵,即i,j,n,m,
矩阵[i,j]:=2
对于初始化k:=1,当k<n时,更新(将k增加1),执行:
dfs(矩阵,p,q,n,m)
p:=(i+k)modn
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