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