【连通区域个数】

#include <iostream>
using namespace std;
void DFS(int R,int W,int i, int j,int **visited,int **mVexs)
{
    int r,w;
    visited[i][j] = 1;    //将该位置的访问标签置为1
    // 遍历该顶点的所有邻接顶点。若是没有访问过且元素为1,则继续深度访问
    if(j>=1)
    {
        r = i;w = j-1;
        {
            if (!visited[r][w] && mVexs[r][w])
                DFS(R,W,r,w, visited,mVexs);
        }
    }
    if(j<W-1)
    {
        r = i;w = j+1;
        {
            if (!visited[r][w] && mVexs[r][w])
                DFS(R,W,r,w, visited,mVexs);
        }
    }
    if(i>=1)
    {
        r = i-1;w = j;
        {
            if (!visited[r][w] && mVexs[r][w])
                DFS(R,W,r,w, visited,mVexs);
        }
    }
    if(i<R-1)
    {
        r = i+1;w = j;
        {
            if (!visited[r][w] && mVexs[r][w])
                DFS(R,W,r,w, visited,mVexs);
        }
    }
}
void countSun(int R,int W,int **mVexs) {
    int **visited=new int*[R];
    int i,j;
    for(i=0;i<R;i++)
        visited[i]=new int[W];
    for(i=0;i<R;i++)
        for(j = 0;j<W;j++)
            visited[i][j] = 0;    //定义访问标记数组,初始化为1,一旦相应位置的元素被访问,则将其置为0

    int count = 0;     //连通区域的个数
    cout<<"DFS"<<endl;
     for (i = 0; i < R; i++)
    {
        for(j = 0;j<W;j++)
        {
            if (!visited[i][j] && mVexs[i][j])   //依次访问目前尚未被访问,且元素为1的位置
            {
                DFS(R,W,i,j,visited,mVexs);     //访问该位置以及其邻域位置
                count++;       //连通区域个数+1
            }
        }
     }
    cout <<count<< endl;
}
int main() {
    int res=0;
    int R=0;
    int W=0;
    cout<<"请输入R:";
    cin>>R;
    cout<<"请输入W:";
    cin>>W;
    int i,j;
    int **arr=new int*[R];
    for(i=0;i<R;i++)
        arr[i]=new int[W];
    for(i=0;i<R;i++)
        for(int j=0;j<W;j++)
            cin>>arr[i][j];
    for(i=0;i<R;i++)
    {
        for(j=0;j<W;j++)
            cout<<arr[i][j]<<‘ ‘;
        cout<<endl;
    }
    countSun(R,W,arr);
    return 0;
}

原文地址:https://www.cnblogs.com/EstherLjy/p/9392279.html

时间: 2024-10-10 09:44:18

【连通区域个数】的相关文章

OpenCV二值图求最大连通区域算法(广度优先算法 BFS)

#include <iostream> #include <opencv2\opencv.hpp> #include <vector> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <windows.h> #include <math.h> #include <queue> using namespace std;usin

OpenCV:二值图像连通区域分析与标记算法实现

编译环境: 操作系统:Win8.1  64位 IDE平台:Visual Studio 2013 Ultimate OpenCV:2.4.8 一.连通域 在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接.4邻接一共4个点,即上下左右,如下左图所示.8邻接的点一共有8个,包括了对角线位置的点,如下右图所示.         如果像素点A与B邻接,我们称A与B连通,于是我们不加证明的有如下的结论: 如果A与B连通,B与C连通,则A与C连通. 在视觉上看来,彼

CSUOJ 1601 War (离线并查集求连通块个数)

1601: War Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 130  Solved: 38 [Submit][Status][Web Board] Description AME decided to destroy CH's country. In CH' country, There are N villages, which are numbered from 1 to N. We say two village A and B ar

使用OpenCV查找二值图中最大连通区域

http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutours 2014-10-19 22:31 2802人阅读 评论(0) 收藏 举报  分类: 图像与OpenCV(15)  版权声明:本文为shaoxiaohu原创文章,欢迎转载,请注明出处,谢谢. 上一篇博文中介绍了matlab查找最大连通区域的方法,OpenCV函数中也有类似的函数与之对应,findC

Opencv2系列学习笔记10(提取连通区域轮廓) 另一个

http://blog.csdn.net/lu597203933/article/details/17362457 连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/details/14489225 轮廓的简单提取算法如下: 系统性地扫描图像直到遇到连通区域的一个点,以它为起始点,跟踪它的轮廓,标记边界上的像素.当轮廓完整闭合,扫描回到上一个位置,

【CCL】连通区域提取

根据朋友给的一份原理写的 感觉还挺清楚 #include "cv.h" #include "highgui.h" #include <stdio.h> using namespace cv; #define MAXWIDTH 352 #define MAXHEIGHT 288 typedef struct PTNode{ int data; int parent; }PTNode; void GetCCL(Mat &imgsrc, Mat &am

连通区域标记-行程扫描算法

1.连通域 对于一幅图像来说,它的基本组成单元是像素,每一个像素又对应一个灰度值. 联通区域标记针对的是二值图像,二值图像顾名思义就是它的灰度值只存在两种值---0或255的图像,一个连通区域指的是图像中那些位置相邻,灰度值相同的像素集合所组成的区域. 像素和像素之间的邻域关系有4邻域和8邻域,4邻域指的是当前像素的上下左右位置处的像素,8邻域是指上下左右和对角线位置处的像素. 如右图所示,分别对应的是像素的4邻域和8邻域位置关系   (x,y-1)   (x-1,y) (x,y) (x+1,y

连通区域

#include <iostream> #include <string> #include <list> #include <vector> #include <map> #include <stack> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> void icvprCcaByTwoPass(co

opencv 二值图像剔除小连通区域

二值图像剔除小面积连通区域在二值图像连通区域分析时很有用,之前做的使用采用了for循环的形式,后来学习了c++标准库,发现可以使用vector.erase(std::remove_if())的方法直接剔除.\ 统计二值图像的连通区域通过cv::findcontours()实现,二值图像轮廓的容器是std::vector.连通区域的面积可以由函数cv::contourArea()得到. 剔除小面积连通区域后,可以使用函数cv::drawContours()函数将轮廓画出,将其第三个参数设置为-1为