获取图片颜色相同的最大块,获取二维数组中值上下左右连续相同的最大块

问题:查找一块图片中区域颜色相同的最大的一块,以二维数组模拟图片,共有1、2、3、4四种颜色。

输入:一个二维数组,每个值为1、2、3、4中的一个。

输出:最大块颜色值及最大块总数值。

主要思路:

参数设置:

int a[10][10],作为被查找最大块的原始数据,数组里用1、2、3、4表示4种不同的颜色。为方便验证正确性,此处使用10*10的二位数组。

int k,记录当前颜色。

int x,int y,表示遍历过程中的当前坐标或将要遍历的坐标。

int flag[10][10],与a[10][10]对应,记录数组中一个值是否已被访问。

int num,记录一个值所在的最大块共有多少块,做参数时应使用引用。

int max,记录当前最大块数的总块数值。

int color,记录当前最大块对应的颜色。

函数:

void find(int a[10][10],int k,int x,int y,int flag[10][10],int &num):

对二维数组进行上、下、左、右四个方向递归,若值超出边界或者该值已被遍历过则返回。使用num记录该块的总数。

void getMax(int a[10][10]):

使用两层for循环,循环中使用find()函数进行查找一个值的最大块,从而整个循环对所有值都过一遍,用max和color记录最大值和相应的颜色。由于用了flag[][]作为被标记,已经被遍历的值将不会重复find()里的递归过程。

时间复杂度:

O(n2),数组中每个值都会遍历一次,当初次遍历时会进行递归遍历,所以时间复杂度为O(n2)。

运行环境:vs2012

#include <iostream>

using namespace std;


    bool isBlock(int x,int y,int flag[10][10]){

        if(x>=0&&x<10&&y>=0&&y<10&&flag[x][y]==0)

            return false;

        else
 
            return true;

    }

    void find(int k,int x,int y,int &num){

        if(isBlock(x,y)||a[x][y]!=k){

            return;

        }

        num++;

        flag[x][y]=1;

        find(k,x,y+1,num);

        find(k,x+1,y,num);

        find(k,x,y-1,num);

        find(k,x-1,y,num);

    }

    int getMax(int a[10][10]){

        int max=0;

        flag =new int[10][10];

        for(int i=0;i<10;i+){

            for(int j=0;j<10;j++){

                num=0;

                find(a[i][j],i,j,num);
                if(max<num)

                    max=num;

            }

        }

        return max;

    }


int main() {


    private int num=0;

    private int a[10][10];

    private int flag[10][10]={0};

	cout  << getMax(a);

	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值