C++ 检查给定的二进制矩阵中是否存在T个连续的0块
介绍
二进制矩阵广泛用于计算机科学和各个领域中,用于表示数据或高效地解决复杂问题。在某些情况下,识别给定的二进制矩阵是否包含连续的零块变得很重要。在本文中,我们将使用C ++代码探索一种优雅的解决方案,该方案允许我们检测在给定的二进制矩阵中是否存在T个连续的零块。这种方法既直观又高效,适用于实际实现。
检查是否存在T个连续的0块
给定一个二维二进制矩阵,其尺寸为N x M,以及一个整数T,我们需要确定矩阵中是否存在T个连续的零块(其中“连续”意味着水平或垂直相邻)。为了实现这一目标,让我们逐步分解该过程,同时使用逻辑和算法方法。
输入验证
在探索二进制矩阵中的模式之前,对用户输入进行适当的验证对于维度和相关特性至关重要。我们必须确保T在可接受的范围内,以提供可行的结果,并保持计算效率。
遍历行和列
为了有效地确定连续的零块,我们必须分别分析行和列。例如,从第一行(顶部)开始,我们将按列遍历全部元素,直到第N行(底部)。同时遍历列有助于捕获水平和垂直序列,自然而不会错过任何潜在的组合。
检测连续块
当我们在每一行的每一列中进行逐步进行时,识别连续的零形成了检测连续零块的基石。
二进制矩阵是一个仅由0和1组成的数组,其中每个元素分别代表“关闭”或“打开”状态。通过分析这两个状态,我们可以辨别出可能提供有关相邻元素之间互联或独特排列的独特模式。
示例
二进制矩阵如下:
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
1 0 0 0 1
我们需要找到矩阵中连续的零的块的数量。T的值为3。
我们可以使用深度优先搜索(DFS)来找到矩阵中连续的零的块。我们从按行和按列遍历矩阵开始。如果我们遇到一个之前未访问过的零元素,我们将其推入堆栈并从该元素开始DFS。
在DFS期间,我们检查当前单元格的四个相邻单元格(上,下,左,右)。如果这些单元格中的任何一个为零且之前未访问过,我们将它们推入堆栈并从该单元格继续DFS。
我们还记录到目前为止遇到的连续零块的数量。如果这个计数大于或等于T,则返回“是”。否则,我们继续DFS直到所有单元格都被访问。
在这种情况下,我们从单元格(0,1)开始DFS。我们在(0,2)和(0,3)遇到两个更多的零元素,并将它们添加到我们的当前路径中。然后我们回溯到单元格(0,1)并检查其相邻单元格。我们在(1,1)又遇到一个零元素,并将其添加到我们的当前路径中。然后我们再次回溯到单元格(0,1)并检查其相邻单元格。我们没有遇到任何之前未访问过的零元素。
然后我们从单元格(3,1)开始DFS。我们在(3,2)和(3,3)遇到两个更多的零元素,并将它们添加到我们的当前路径中。然后我们回溯到单元格(3,1)并检查其相邻单元格。我们没有遇到任何之前未访问过的零元素。
我们现在在矩阵中找到了三个连续的零块。因为这个计数大于或等于T=3,所以输出是“是”。
方法1:用C++代码检查是否存在T个连续的0块
为了实现我们的目标,我们可以在二进制矩阵上利用图遍历技术,并跟踪访问过的单元格。我们将使用深度优先搜索(DFS)算法结合回溯原则。
步骤
步骤1: 初始化必要的变量,如定义常量N和M表示输入二进制矩阵的大小,声明大小为N x M的辅助布尔数组’visited’和’inCurrentPath’,并最初将这两个数组的所有元素设置为false。
步骤2: 实现DFS函数并包含主函数
步骤3: 根据输入的二进制矩阵,将输出打印为“是”或“否”。
示例
#include<iostream>
#include<stack>
#include<bitset>
#define N 100
#define M 100
struct Node {
int i;
int j;
};
bool DFS(bool matrix[], int rows, int cols, int T)
{
if(matrix == nullptr || rows <= 0 || cols <= 0 || T <= 0) // check for invalid input
return false;
std::bitset<N*M> visited; // declare bitset to mark visited cells
std::bitset<N*M> inCurrentPath; // declare bitset to mark cells in current path
std::stack<Node> s; // declare stack to store nodes for DFS
for(int i=0;i<rows;++i){
for(int j=0;j<cols;++j){
if(matrix[i*cols+j] == 0 && !visited[i*cols+j]){
s.push({i,j});
int count = 0; // initialize count to zero for each new search
while(!s.empty()){
Node node = s.top();
s.pop();
if(node.i < 0 || node.i >= rows || node.j < 0 || node.j >= cols || visited[node.i*cols+node.j])
continue;
visited[node.i*cols+node.j] = true;
if(matrix[node.i*cols+node.j] == 0 && !inCurrentPath[node.i*cols+node.j]){
inCurrentPath[node.i*cols+node.j] = true;
count++;
}
if(count >= T){
std::cout << "Yes, the path is: "; // print yes and the path
for(int k=0;k<N*M;++k){
if(inCurrentPath[k]){
std::cout << "(" << k/cols << "," << k%cols << ") "; // print the coordinates of the cells in the path
}
}
std::cout << "\n";
return true;
}
s.push({node.i+1,node.j});
s.push({node.i-1,node.j});
s.push({node.i,node.j+1});
s.push({node.i,node.j-1});
}
inCurrentPath.reset(); // reset the path after each search
}
}
}
std::cout << "No\n"; // print no if no path is found
return false;
}
int main()
{
bool matrix[N*M] = {1,1,0,0,1,
1,0,0,0,1,
1,1,1,1,1,
1,1,0,0,1,
}; // Binary matrix
int T = 3; // Number of continuous blocks to find
DFS(matrix, N, M, T); // call DFS function
return 0;
}
输出
Yes, the path is: (0,2) (1,0) (1,1)
结论
通过利用呈现的使用深度优先搜索(DFS)涉及图遍历技术的C++代码,我们可以方便地确定在二进制矩阵中是否存在给定数量(T)的连续零块。这个解决方案为解决与二进制矩阵相关的问题提供了高效的方法,使研究人员和开发人员能够高效地创建强大的算法。
极客笔记