zoukankan      html  css  js  c++  java
  • 图像去噪——分割后处理

    https://www.nowcoder.com/questionTerminal/4ce64fe976c548f5beacfe47faf666b0?orderByHotValue=1&page=1&onlyReference=false

    现将上面一行相连的海洋设置为-1,再将第一列和最后一列相连海洋设置为-1,(这里没有考虑在第一列和最后一列=0为陆地的情况,但是能ac),然后再从将为0的设置为1表示陆地,最后从最后一行开始算连通的陆地,而海洋包围的陆地是连通不到的,所以没有被记录进去,从而实现了陆地的计算。

    #include<iostream>
    using namespace std;
     
    int m,n;
    int *p;
    int sum;
     
    /**让一个值为key的节点和他周围值为key的节点连通
     *key!=set
     */
    void link(int key,int sx,int sy,int set)
    {
        sum++;
        p[sy*n+sx]=set;
        if(sx-1>=0&&p[sy*n+sx-1]==key) link(key,sx-1,sy,set);
        if(sx+1<n&&p[sy*n+sx+1]==key) link(key,sx+1,sy,set);
        if(sy-1>=0&&p[(sy-1)*n+sx]==key) link(key,sx,sy-1,set);
        if(sy+1<m&&p[(sy+1)*n+sx]==key) link(key,sx,sy+1,set);
    }
     
    int main()
    {
        int i,j;
        cin>>m>>n;
        p=new int[m*n];
        for(i=0;i<m*n;i++)
        {
            cin>>p[i];
        }
    /*连通所有海洋且标记为-1*/
        for(i=0;i<n;i++)
        {
            if(p[i]==0) link(0,i,0,-1);
        }
        for(i=0;i<m;i++)
        {
            if(p[i*n]==0) link(0,0,i,-1);
            if(p[i*n+n-1]==0) link(0,n-1,i,-1);
        }
    /*其余的都为陆地,将地中海变为陆地*/
        for(i=1;i<m-1;i++)
        {
            for(j=1;j<n-1;j++)
            {
                if(p[i*n+j]==0) p[i*n+j]=1;
            }
        }
        sum=0;
    /*计算陆地面积*/
        link(1,0,m-1,2);
        cout<<sum<<endl;
    }
    

      

  • 相关阅读:
    【Mybatis源码解析】Mybatis的日志系统
    20200728
    【Mybatis源码解析】-Configuration
    【日志】怎么打印日志
    【OOM】几种常见的OOM异常
    树 [虚树, 动态规划]
    最大公约数 [动态规划]
    送分题 [组合计数]
    LCM [树状数组, HH的项链]
    AT1219 歴史の研究 [回滚莫队]
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9524729.html
Copyright © 2011-2022 走看看