zoukankan      html  css  js  c++  java
  • 连通块【岛问题】总结

    题目:

    给出一个mxn 的矩阵,矩阵中的元素为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。

      使用DFS和BFS遍历都行,先找到一个1,然后对其上下左右四个位置进行判断是不是1,同时将遍历过的位置进行标记,防止重复遍历

      这里以二维数组讲解,其实n维数组和二维数组问题解法一样

      注意:

        使用BFS解题时,注意其标记已遍历的位置

        使用DFS解题时,有个内存溢出的缺陷,特别是2维数组以上,这时候应该选择BFS求解

      

     1 oid DFS(int i, int j)
     2 {
     3     if (i < 0 || i >= v.size() || j < 0 || j >= v[i].size() || v[i][j] != 1)
     4         return;
     5     v[i][j] = 2;//染色,或者使用visit禁忌表
     6     DFS(i + 1, j);
     7     DFS(i - 1, j);
     8     DFS(i, j + 1);
     9     DFS(i, j - 1);
    10 }
    11 void BFS(int i, int j)
    12 {
    13     queue<pair<int, int>>q;
    14     q.push(make_pair(i, j));
    15     v[i][j] = 2;//染色,或者使用visit禁忌表
    16     vector<vector<int>>dir = { {1,0},{-1,0},{0,1},{0,-1} };//方向
    17     while (!q.empty())
    18     {
    19         pair<int, int>p = q.front();
    20         q.pop();
    21         for (int k = 0; k < 4; ++k)
    22         {
    23             int x = p.first + dir[k][0], y = p.second + dir[k][1];
    24             if (x < 0 || x >= v.size() || y < 0 || y >= v[0].size())
    25                 continue;
    26             if (v[x][y] == 1)
    27             {
    28                 q.push(make_pair(x, y));
    29                 v[x][y] = 2;//一定是在入栈的时候进行染色
    30             }
    31         }
    32     }
    33 }
    34 int main()
    35 {
    36     v = {
    37     {0, 1, 1, 1, 0, 0, 1},
    38     {0, 0, 1, 0, 0, 0, 0 },
    39     {0, 0, 0, 0, 1, 0, 0},
    40     {0, 0, 0, 1, 1, 1, 0},
    41     {1, 1, 1, 0, 1, 0, 0},
    42     {1, 1, 1, 1, 0, 0, 0},
    43     };
    44     
    45     for (int i = 0; i < v.size(); ++i)
    46     {
    47         for (int j = 0; j < v[i].size(); ++j)
    48         {
    49             if (v[i][j] == 1)
    50             {
    51                 BFS(i, j);
    52                 //DFS(i, j);//切记,一般内存超出的问题就是数量太大,导致DFS递归的内存栈溢出,应换用BFS
    53                 ++cnt;
    54             }
    55         }
    56     }
    57     cout << cnt;
    58 }
  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/zzw1024/p/11930549.html
Copyright © 2011-2022 走看看