目录
语法
算法
方法2
示例 2
输出
代码
结论
首页 后端开发 C++ 查询以更新的矩阵中连接的非空单元格的数量

查询以更新的矩阵中连接的非空单元格的数量

Sep 10, 2023 am 09:01 AM
查询 单元格 更新 数量 连接 矩阵 非空

查询以更新的矩阵中连接的非空单元格的数量

矩阵可以被认为是按行和列组织的单元格的集合。每个单元格可以包含一个值,该值可以为空或非空。在计算机编程中,矩阵通常用于表示二维网格中的数据。

在本文中,我们将讨论如何有效地计算矩阵中连接的非空单元格的数量,同时考虑到矩阵可能的更新。我们将探索解决此问题的不同方法,并提供真实的代码示例来演示实现。

语法

使用 C/C++ 查询矩阵中连接的非空单元格数量并进行更新的基本语法可以定义如下 -

int queryCount(int matrix[][MAX_COLS], int rows, int cols);
登录后复制

其中matrix是输入的“矩阵”,“rows”和“cols”分别表示矩阵中的行数和列数。函数“queryCount”返回一个整数值,表示矩阵中连接的非空单元格的数量。

算法

为了解决这个问题,我们可以遵循以下算法 -

第 1 步 - 将变量“count”初始化为 0,这将存储连接的非空单元格的计数。

第 2 步 - 迭代矩阵中的每个单元格。

步骤 3 - 对于每个单元格,检查它是否非空(即包含非空值)。

第 4 步 - 如果单元格非空,则将“计数”增加 1。

步骤 5 - 检查单元格是否有任何非空的相邻单元格。

第 6 步 - 如果相邻单元格非空,则将“计数”增加 1。

步骤 7 - 对所有相邻单元格重复步骤 5-6。

第 8 步 - 8:迭代矩阵中的所有单元格后,返回“计数”作为最终结果。

方法

  • 方法 1 - 解决此问题的一种常见方法是使用深度优先搜索 (DFS) 算法

  • 方法 2 - 实现查询以查找具有更新的矩阵中连接的非空单元格计数的另一种方法是使用广度优先搜索 (BFS) 算法。

方法 1

在这种方法中,DFS 算法涉及递归遍历矩阵并跟踪访问过的单元以避免重复计数。

示例 1

此方法在二维矩阵上执行深度优先搜索。矩阵的维数、单元格值和查询次数都是随机确定的。 countConnectedCells 子例程执行 DFS 并返回互连的非空单元格的计数,从位于指定行和列的单元格开始。 updateCell 函数更新矩阵中单元格的值。主函数使用当前时间启动随机种子,然后生成随机矩阵大小和元素,然后是随机数量的查询。对于每个查询,代码随机选择计数查询 (1) 或更新查询 (2) 并执行相应的操作。如果查询的类型为 1,则调用 countConnectedCells 函数来确定互连的非空单元格的计数并打印结果。如果查询类型为2,则调用updateCell函数调整指定单元格的值。

#include <iostream>
using namespace std;

const int MAX_SIZE = 100; // Maximum size of the matrix

// Function to count connected non-empty cells using DFS
int countConnectedCells(int matrix[][MAX_SIZE], int rows, int cols, int row, int col, int visited[][MAX_SIZE]) {
   if (row < 0 || row >= rows || col < 0 || col >= cols || matrix[row][col] == 0 || visited[row][col])
      return 0;

   visited[row][col] = 1;
   int count = 1; // Counting the current cell as non-empty
   count += countConnectedCells(matrix, rows, cols, row - 1, col, visited); // Check top cell
   count += countConnectedCells(matrix, rows, cols, row + 1, col, visited); // Check bottom cell
   count += countConnectedCells(matrix, rows, cols, row, col - 1, visited); // Check left cell
   count += countConnectedCells(matrix, rows, cols, row, col + 1, visited); // Check right cell

   return count;
}

// Function to update a cell in the matrix
void updateCell(int matrix[][MAX_SIZE], int rows, int cols, int row, int col, int newValue) {
   matrix[row][col] = newValue;
}

// Function to initialize the matrix
void initializeMatrix(int matrix[][MAX_SIZE], int rows, int cols) {
   for (int i = 0; i <rows; i++) {
      for (int j = 0; j < cols; j++) {
         cin >> matrix[i][j]; // Taking input for each cell in the matrix
      }
   }
}

int main() {
   int rows, cols; // Input matrix size
   cin >> rows >> cols; // Taking input for matrix size

   int matrix[MAX_SIZE][MAX_SIZE]; // Matrix to store the values
   int visited[MAX_SIZE][MAX_SIZE] = {0}; // Visited matrix to keep track of visited cells

   initializeMatrix(matrix, rows, cols); // Initialize the matrix with input values

   int queries; // Input number of queries
   cin >> queries; // Taking input for number of queries

   for (int i = 0; i < queries; i++) {
      int queryType; // Input query type (1 for count query, 2 for update query)
      cin >> queryType; // Taking input for query type

      if (queryType == 1) {
         int row, col; // Input row and column for count query
         cin >> row >> col; // Taking input for row and column
         int count = countConnectedCells(matrix, rows, cols, row, col, visited); // Call countConnectedCells function
         cout << "Count of connected non-empty cells at (" << row << ", " << col << "): " << count << endl; // Print result
      } else if (queryType == 2) {
         int row, col, newValue; // Input row, column, and new value for update query
         cin >> row >> col >> newValue; // Taking input for row, column, and new value
         updateCell(matrix, rows, cols, row, col, newValue); // Call updateCell function
      }
   }
   return 0;
}
登录后复制

输出

Count of connected non-empty cells at (1, 2): 0
Count of connected non-empty cells at (0, 1): 2
登录后复制

方法2

在这种方法中,广度优先搜索(BFS)是另一种图遍历算法,可用于查找矩阵中连接的非空单元格的数量。在 BFS 中,我们从给定的单元开始,以广度优先的方式(即逐层)探索其所有相邻单元。我们使用队列来跟踪要访问的单元格,并标记已访问的单元格以避免多次计数。

示例 2

该代码构成了一个在二维矩阵上执行广度优先搜索算法的软件。矩阵的维数、单元格值和查询数量是任意生成的。该代码包含两个子例程:一个用于执行 BFS,另一个用于调整矩阵内的单元。

BFS 操作从随机选择的小区开始,并检查其相邻小区以确定它们是否互连且未被占用。如果是这样,它们将被附加到队列中并以类似的方式进行处理。更新矩阵内的单元仅涉及更改其值。生成矩阵和查询数量后,代码随机选择 BFS 查询或更新查询并执行适当的操作。 BFS 查询的结果是从所选单元格开始的互连未占用单元格的计数。

代码

#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MAX_SIZE = 100;

// Function to perform Breadth-First Search (BFS)
int bfs(int matrix[][MAX_SIZE], int rows, int cols, int row, int col, int visited[][MAX_SIZE]) {
   int count = 0;
   queue<pair<int, int>> q;
   q.push({row, col});

   while (!q.empty()) {
      pair<int, int> currentCell = q.front();
      q.pop();

      int currentRow = currentCell.first;
      int currentCol = currentCell.second;

      if (currentRow >= 0 && currentRow <rows && currentCol >= 0 && currentCol < cols && !visited[currentRow][currentCol] && matrix[currentRow][currentCol] == 1) {
         count++;
         visited[currentRow][currentCol] = 1;

         q.push({currentRow - 1, currentCol});
         q.push({currentRow + 1, currentCol});
         q.push({currentRow, currentCol - 1});
         q.push({currentRow, currentCol + 1});
      }
   }
   return count;
}
// Function to update a cell in the matrix
void updateCell(int matrix[][MAX_SIZE], int row, int col, int newValue) {
   matrix[row][col] = newValue;
}

// Function to generate a random integer between min and max (inclusive)
int randomInt(int min, int max) {
   return rand() % (max - min + 1) + min;
}

int main() {
   srand(time(0));

   int rows = randomInt(1, 10);
   int cols = randomInt(1, 10);

   int matrix[MAX_SIZE][MAX_SIZE];
   int visited[MAX_SIZE][MAX_SIZE] = {0};

   for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
         matrix[i][j] = randomInt(0, 1);
      }
   }

   int queries = randomInt(1, 5);

   for (int i = 0; i < queries; i++) {
      int queryType = randomInt(1, 2);

      if (queryType == 1) {
         int row = randomInt(0, rows - 1);
         int col = randomInt(0, cols - 1);
         int count = bfs(matrix, rows, cols, row, col, visited);
         cout << "Count of connected non-empty cells at (" << row << ", " << col << "): " << count << endl;
      } else if (queryType == 2) {
         int row = randomInt(0, rows - 1);
         int col = randomInt(0, cols - 1);
         int newValue = randomInt(0, 1);
         updateCell(matrix, row, col, newValue);
      }
   }
   return 0;
}
登录后复制

输出

Count of connected non-empty cells at (0, 0): 0
登录后复制

结论

在本文中,我们讨论了两种使用 C/C++ 查找矩阵中连接的非空单元格数量并进行更新的方法。深度优先搜索(DFS)算法和并集查找(不相交集并集)。在为特定用例选择最合适的方法之前,分析每种方法的时间复杂度和空间复杂度非常重要。

以上是查询以更新的矩阵中连接的非空单元格的数量的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

暴雪战网更新一直卡在45%怎么解决? 暴雪战网更新一直卡在45%怎么解决? Mar 16, 2024 pm 06:52 PM

  暴雪战网更新一直卡在45%怎么解决?近期有很多人在更新软件的时候,都是卡在45%的进度条,重启多次还是会卡住,那么这种情况应该要如何解决,我们可以通过重新安装客户端、切换地区、删除文件的方式来处理,本期软件教程就来分享操作步骤,希望能够给更多的人带来帮助。  暴雪战网更新一直卡在45%怎么解决  一、客户端  1、首先需要确认你的客户是官网下载的官方版本。  2、如果不是的话,用户可以进入亚服网址来进行下载。  3、进入以后点击右上角的下载就可以了。  注意:安装的时候一定不要选择简体中文。

12306怎么查询历史购票记录 查看历史购票记录的方法 12306怎么查询历史购票记录 查看历史购票记录的方法 Mar 28, 2024 pm 03:11 PM

  12306订票app下载最新版是一款大家非常满意的出行购票软件,想去哪里就去那里非常方便,软件内提供的票源非常多,只需要通过实名认证就能在线购票,所有用户的出行车票机票都可以轻松买到,享受不同的优惠折扣。还能提前开启预约抢票,预约酒店、专车接送都是可以的,有了它想去哪里就去那里一键购票,出行更加简单方便,让大家的出行体验更舒服,现在小编在线详细为12306用户们带来查看历史购票记录的方法。  1.打开铁路12306,点击右下角我的,点击我的订单  2.在订单页面点击已支付。  3.在已支付页

如何在Ubuntu 24.04上安装Angular 如何在Ubuntu 24.04上安装Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一种可自由访问的JavaScript平台,用于创建动态应用程序。它允许您通过扩展HTML的语法作为模板语言,以快速、清晰地表示应用程序的各个方面。Angular.js提供了一系列工具,可帮助您编写、更新和测试代码。此外,它还提供了许多功能,如路由和表单管理。本指南将讨论在Ubuntu24上安装Angular的方法。首先,您需要安装Node.js。Node.js是一个基于ChromeV8引擎的JavaScript运行环境,可让您在服务器端运行JavaScript代码。要在Ub

学信网如何查询自己的学历 学信网如何查询自己的学历 Mar 28, 2024 pm 04:31 PM

学信网如何查询自己的学历?在学信网中是可以查询到自己的学历,很多用户都不知道如何在学信网中查询到自己的学历,接下来就是小编为用户带来的学信网查询自己学历方法图文教程,感兴趣的用户快来一起看看吧!学信网使用教程学信网如何查询自己的学历一、学信网入口:https://www.chsi.com.cn/二、网站查询:第一步:点击上方学信网地址,进入首页点击【学历查询】;第二步:在最新的网页中点击如下图箭头所示的【查询】;第三步:之后在新页面点击【的登陆学信档案】;第四步:在登陆页面输入信息点击【登陆】;

修复Edge你的连接不是专用连接的三种方法 修复Edge你的连接不是专用连接的三种方法 Mar 13, 2024 pm 01:30 PM

  大家在使用Edge浏览器访问网页的时候,有遇到提示你的连接不是专用连接,导致网页浏览失败的情况吗?这是怎么回事?很多小伙伴遇到这种问题都不知道如何处理,可以看看下面三个解决办法。  方法一(简单粗暴):在edge浏览器中,您可以通过进入设置并关闭安全性功能,然后在网站权限中阻止位置权限来尝试解决原先报错的网站无法访问的问题。需要注意的是,这种方法的有效性和持续时间可能会有所不同,无法确定具体的效果。重新启动浏览器后,您可以尝试访问该网站,看看是否问题得到解决。  方法二:  调整键盘为英文输

Windows无法访问指定设备、路径或文件 Windows无法访问指定设备、路径或文件 Jun 18, 2024 pm 04:49 PM

小伙伴电脑出现这样的故障,打开“此电脑”和C盘文件会提示“Explorer.EXEWindows无法访问指定设备、路径或文件。你可能没有适当的权限访问访问该项目。”包括文件夹、文件、此电脑、回收站等,双击都会弹出这样的窗口,右键打开又是正常的。这是系统更新导致,如果你也遇到这样的情况,下面小编教大家如何解决。一,打开注册表编辑器Win+R,输入regedit,或右键开始菜单运行输入regedit;二,定位注册表“计算机\HKEY_CLASSES_ROOT\PackagedCom\ClassInd

一加手表怎么连接蓝牙耳机_一加手表连接蓝牙耳机的方法 一加手表怎么连接蓝牙耳机_一加手表连接蓝牙耳机的方法 Mar 23, 2024 pm 01:16 PM

1、将耳机放在耳机盒中并保持盖子打开,长按盒子上的按键使耳机进入进入配对状态。2、打开手表音乐功能并选择蓝牙耳机,或在手表设置功能选择蓝牙耳机。3、在手表选择该耳机即可配对成功。

微星显卡驱动怎么更新?微星显卡驱动下载安装步骤 微星显卡驱动怎么更新?微星显卡驱动下载安装步骤 Mar 13, 2024 pm 08:49 PM

  微星显卡是市面上主流的显卡品牌,我们知道显卡都需要安装驱动才能发挥性能,并保证兼容性。那么微星显卡驱动要怎么更新到最新版本呢?一般微星显卡驱动可以官网下载驱动安装,下面就来了解一下吧。  显卡驱动更新方法:  1.首先我们进入“微星官网”。  2.进入后点击右上角“搜索”按钮并输入自己的显卡型号。  3.然后找到对应的显卡点开详情页。  4.随后进入上方“技术支持”选项。  5.最后在“驱动&下载”

See all articles