C++ 如何检查矩阵划分了多少部分

C++ 如何检查矩阵划分了多少部分,c++,matrix,C++,Matrix,我有一个由0和1组成的矩阵。我需要一种方法来看看有多少“零块”。以下是一张更好地说明的图片: 在本例中,有4个“零块”除以黑色块(矩阵中的块)。我建议查看BFS和DFS以进行图形遍历。您可以将矩阵表示为图形,其中每个单元在4个方向上与其相邻单元相连:北、南、东和西 如果您有问题,请在注释中告诉我更多详细信息。如上所述,您可以使用dfs在图形中查找组件。下面是一个在网格上工作的经典代码示例,其中X表示墙,0表示自由空间(在您的示例中为黑白方块): #包括 #包括 使用Map=std::vecto

我有一个由0和1组成的矩阵。我需要一种方法来看看有多少“零块”。以下是一张更好地说明的图片:


在本例中,有4个“零块”除以黑色块(矩阵中的块)。

我建议查看BFS和DFS以进行图形遍历。您可以将矩阵表示为图形,其中每个单元在4个方向上与其相邻单元相连:北、南、东和西


如果您有问题,请在注释中告诉我更多详细信息。

如上所述,您可以使用dfs在图形中查找组件。下面是一个在网格上工作的经典代码示例,其中X表示墙,0表示自由空间(在您的示例中为黑白方块):

#包括
#包括
使用Map=std::vector;
使用BoolMap=std::vector;
无效dfs(布尔映射和访问,整数x,整数y)
{
如果(x<0 | | y<0 | | y>=访问过的.size()| | x>=访问过的[y].size())
返回;
如果(访问[y][x])
返回;
访问[y][x]=真;
dfs(已访问,x-1,y);
dfs(已访问,x+1,y);
dfs(已访问,x,y-1);
dfs(已访问,x,y+1);
}
int main()
{
地图;
地图。安置在后方(“0X00”);
地图。安置在后方(“XXX0”);
映射。放置回(“0X0X”);
地图。安置在后方(“0X00”);
已访问BoolMap(map.size());
对于(size_t y=0;ystd::cout@E.N.D为什么回答不好?我不应该为这个问题编写完整的代码(尽管我可以这样做,因为我以前多次实现过这个问题)。我给出了解决这个问题的最佳方法和算法,这比代码本身更重要。
#include <vector>
#include <string>

using Map = std::vector<std::string>;
using BoolMap = std::vector<std::vector<bool>>;

void dfs(BoolMap& visited, int x, int y)
{
    if (x < 0 || y < 0 || y >= visited.size() || x >= visited[y].size())
        return;
    if (visited[y][x]) 
        return;

    visited[y][x] = true;
    dfs(visited, x - 1, y);
    dfs(visited, x + 1, y);
    dfs(visited, x, y - 1);
    dfs(visited, x, y + 1);
}

int main()
{
    Map map;
    map.emplace_back("0X00");
    map.emplace_back("XXX0");
    map.emplace_back("0X0X");
    map.emplace_back("0X00");

    BoolMap visited(map.size());
    for (size_t y = 0; y < map.size(); y++)
    {
        visited[y].resize(map[y].size());
        for (size_t x = 0; x < map[y].size(); x++)
        {
            // set visited to true if there is a wall
            visited[y][x] = (map[y][x] == 'X');
        }
   }

    size_t component_count = 0;

    for (size_t y = 0; y < map.size(); y++)
    {
         for (size_t x = 0; x < map[y].size(); x++)
        {
            if (!visited[y][x])
            {
                dfs(visited, x, y);
                component_count++;
            }
        }
    }

    std::cout << component_count << std::endl;
}