问题:查找一块图片中区域颜色相同的最大的一块,以二维数组模拟图片,共有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;
}