前言
具体的处理算法思路,可以参考以下:
https://blog.csdn.net/SuperAlanSun/article/details/120114758
这里主要讲如何处理8领域。
8领域处理代码
接上次的8领域处理代码:
我们需要在4领域的基础上,加上其他4个斜方向即可
void floodfill(int* fp, int i, int* count, int rows, int cols)
{
if (*fp == 1)
{
*(fp) = 0;
(*count)++;
if (i > cols && i < ((rows - 1) * cols - 1) && i % cols != 0 && i % cols != i)//8个方向齐全
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i == 0)//左上角缺-1,-5方向
{
//floodfill((fp - cols), i - cols, count, rows, cols);//上
//floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
//floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
//floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
//floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i == cols - 1)//右上角缺+1,-5方向
{
//floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
//floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
//floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
//floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
//floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i == (rows - 1) * cols)//左下角缺-1,+5方向
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
//floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
//floodfill((fp + cols), i + cols, count, rows, cols);//下
//floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
//floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
//floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i == (rows * cols - 1))//右下角缺+1,+5方向
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
//floodfill((fp + 1), i + 1, count, rows, cols);//右
//floodfill((fp + cols), i + cols, count, rows, cols);//下
floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
//floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
//floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
//floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i % cols == 0 && i != 0 && i != (rows - 1) * cols)//左区缺-1
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
//floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
//floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
//floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i > (rows - 1) * cols && i < (rows * cols - 1))//下区缺+5
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
//floodfill((fp + cols), i + cols, count, rows, cols);//下
floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
//floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
//floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i % cols == (cols - 1) && i != (cols - 1) && i != rows * (cols - 1))//右区缺+1
{
floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
//floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
//floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
//floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else if (i > 0 && i < (cols - 1))//上区缺-5
{
//floodfill((fp - cols), i - cols, count, rows, cols);//上
floodfill((fp - 1), i - 1, count, rows, cols);//左
floodfill((fp + 1), i + 1, count, rows, cols);//右
floodfill((fp + cols), i + cols, count, rows, cols);//下
//floodfill((fp - cols - 1), i - cols - 1, count, rows, cols);//斜左上
//floodfill((fp - cols + 1), i - cols + 1, count, rows, cols);//斜右上
floodfill((fp + cols - 1), i + cols - 1, count, rows, cols);//斜左下
floodfill((fp + cols + 1), i + cols + 1, count, rows, cols);//斜右下
}
else
{
cout << "wrong" << endl;
}
}
}
拓展
其实,我的灵感来源于图像处理算法中的满水函数,其实,我们也可以换成数组数据进行处理。同样的,以上代码改动后,也可以用于图像处理。