题目描述
给出一个n*m的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置(x,y+1)、(x,y-1)、(x+1,y)、(x-1,y)是相邻的。如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵中“块”的个数。
例如:
0 1 1 1 0 0 1
0 0 1 0 0 0 0
0 0 0 0 1 0 0
0 0 0 1 1 1 0
1 1 1 0 1 0 0
1 1 1 1 0 0 0
是 6 * 7 的矩阵,“块”的个数为4
解题思路:
使用广度优先搜索遍历来实现
先判断当前位置是否为1,若不是,则进行下一个坐标判断。
若是1,则判断其四周的坐标是否为1,若为1,则令当前坐标变为四周坐标的某一个。
可以将(x,y+1)、(x,y-1)、(x+1,y)、(x-1,y)这四个坐标用两个数组来表示
int X[] = {
0,0,1,-1};
int Y[] = {
1,-1,0,0};
代码如下:
#include <iostream>
using namespace std;
#include <queue>
//用来存放坐标信息
struct Node
{
int x, y;
Node(int x, int y) {
this->x = x;
this->y = y;
}
};
const int bfs_max_n = 100;
//增量数组
const int X[] = {
0,0,1,-1 };
const int Y[] = {
1,-1,0,0 };
int matrix[bfs_max_n][bfs_max_n];//0 1 矩阵
//记录当前坐标是否已经入队
bool inq[bfs_max_n][bfs_max_n] = {
false };
//判断当前坐标是否需要访问
bool