C++ 中的布尔矩阵问题?

c++server side programmingprogramming

这里我们将看到一个有趣的布尔矩阵问题。给定一个包含 0 和 1 的布尔矩阵。我们的目标是找到 1 被标记的位置。如果 1 被标记为 mat[i,j] 的位置,那么我们将使行 i 和列 j 的所有条目都进入 1。让我们看一个例子。如果矩阵如下 −

1 0 0 1
0 0 0 0
0 0 0 0
0 1 0 0

那么修改后就是 −

1 1 1 1
1 1 0 1
1 1 0 1
1 1 1 1

算法

matrixUpdate(matrix[R,C])

begin
   定义两个矩阵row[R]和col[C],并用0填充
   标记 mat[R,C] 的行和列索引,其中 1 被放入 row[R] 和 col[C] 矩阵中
   检查 row[R] 和 col[C] 是否标记了该位置,然后用 1 填充该行和列的所有位置。
end

示例

#include <iostream>
#define R 4
#define C 4
using namespace std;
void updateMatrix(bool mat[R][C]) {
   bool row[R];
   bool col[C];
   int i, j;
   for (int i = 0; i < R; i++) { //将行矩阵的所有元素设置为 0
      row[i] = 0;}
      for (i = 0; i < C; i++) { //将列矩阵的所有元素设置为 0
         col[i] = 0;}
         for (int i = 0; i < R; i++) { //标记行和列矩阵以确定 1 存在的位置
            for (int j = 0; j < C; j++) {
                if (mat[i][j] == 1) {
                  row[i] = 1;
                col[j] = 1;
               }
              }
           }
         for (i = 0; i < R; i++) { //将行和列全部设置为 1,其中 1 被标记
            for (j = 0; j < C; j++) {
               if ( row[i] == 1 || col[j] == 1 ) {
                  mat[i][j] = 1;
               }
            }
         }
      }
      void displayMatrix(bool mat[R][C]) {
         for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
               cout << mat[i][j];
            }
            cout << endl;
         }
      }
      main() {
         bool mat[R][C] = { {1, 0, 0, 1},
         {0, 0, 0, 0},
         {0, 0, 0, 0},
         {0, 1, 0, 0}
      };
      cout << "给定矩阵" << endl;
      displayMatrix(mat);
      updateMatrix(mat);
      cout << "更新矩阵" << endl;
      displayMatrix(mat);
}

输出

给定矩阵
1001
0000
0000
0100
更新矩阵
1111
1101
1101
1111

相关文章