题目描述,给出一个由01组成的矩阵,任何连在一起的1都看作一块岛,问矩阵中有几个岛
先默写一下BFS的模版
void BFS(int x){queue<int> q;q.push(x);while(!q.empty()){int top = q.front;q.pop();//下一层符合条件的结点入队,并标记已经入队}}
代码
#include<algorithm>#include<queue>#include<cstdio>using namespace std;const int maxn = 10010;struct Node{int x, y;}node[maxn];int n, m, ans = 0;int matrix[maxn][maxn];bool inq[maxn][maxn] = {false};int X[4] = {0, 0, 1, -1};int Y[4] = {1, -1, 0, 0};bool judge(int x, int y){if(x >= n || y >= m || x < 0 || y < 0 || inq[x][y] == true || matrix[x][y] == 0){return false;}else {return true;}}void BFS(int x, int y){//这道题里的BFS的作用是找出给定节点所在的岛queue<Node> q;Node temp;temp.x = x, temp.y = y;q.push(temp);inq[x][y] = true;while(!q.empty()){Node top = q.front();q.pop();for(int i = 0; i < 4; i++){int newx = top.x + X[i];int newy = top.y + Y[i];if(judge(newx, newy)){inq[newx][newy] = true;temp.x = newx, temp.y = newy;q.push(temp);}}}}int main(){scanf("%d%d",&n,&m);for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){scanf("%d",&matrix[i][j]);}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(inq[i][j]==false && matrix[i][j] == 1){BFS(i, j);ans++;}}}printf("%d",ans);}
