1267、这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。
如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。
请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
示例 3:
输入:grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
输出:4
解释:第一行的两台服务器互相通信,第三列的两台服务器互相通信,但右下角的服务器无法与其他服务器通信。
矩阵图,对每一个点遍历。遇见1,则对其行列进行检查。
- 当该点行列都已经被标记,无需多余操作,continue
- 当该点,行未被标记,对该i行j+1列--n列,遍历check是否有1,若有1,则flag=true,证明该点通路。判断该1是否已经被遍历到,即判断该1所属行mark_m[a]是否为T
- 当该点,列未被标记,对该j列i+1行--m行,遍历check是否有1,若有1,则flag=true,证明该点通路。判断该1是否已经被遍历到,即判断该1所属行mark_n[b]是否为T
讨论较为复杂,提交好几次失败,寻找原因才AC。
class Solution{
public:
int countServers(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size(); // m行n列
int ans = 0, tmp = 0, cnt = 0;
vector<bool> mark_m(m, false);
vector<bool> mark_n(n, false);
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++){
if(grid[i][j] ){ //找到一个1,检查其所属行列
if(mark_m[i] && mark_n[j]) continue;
bool flag = false;
if(!mark_m[i]) {
cnt++;
for(int b = j + 1; b < n; b++)
if(grid[i][b]) {flag = true; if(!mark_n[b]) tmp++; }
}
if(!mark_n[j]) {
cnt++;
for(int a = i + 1; a < m; a++)
if(grid[a][j])