用C语言书写实现种子填充算法的代码
时间: 2023-11-22 21:05:30 浏览: 94
C语言编写的种子填充法
5星 · 资源好评率100%
以下是使用C语言实现种子填充算法(又称为洪泛填充算法)的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义坐标结构体
typedef struct {
int x;
int y;
} Point;
// 种子填充函数
void seedFill(int x, int y, char target_color, char replacement_color, char image[][MAX_SIZE], int width, int height) {
// 如果目标点颜色与替换颜色相同,则不需要填充
if (target_color == replacement_color) {
return;
}
// 定义四个方向的偏移量
Point offset[4] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
// 定义一个栈来保存待填充的坐标
Point stack[MAX_SIZE * MAX_SIZE];
int top = 0;
// 将种子点入栈
stack[top].x = x;
stack[top].y = y;
top++;
// 循环取出栈中的坐标直到栈为空
while (top > 0) {
// 取出栈顶坐标
Point p = stack[top - 1];
top--;
// 如果该点颜色与目标点颜色相同,则进行替换
if (image[p.y][p.x] == target_color) {
image[p.y][p.x] = replacement_color;
// 将该点周围未填充的点入栈
for (int i = 0; i < 4; i++) {
int new_x = p.x + offset[i].x;
int new_y = p.y + offset[i].y;
// 判断该点是否在图像内且未填充
if (new_x >= 0 && new_x < width && new_y >= 0 && new_y < height && image[new_y][new_x] == target_color) {
stack[top].x = new_x;
stack[top].y = new_y;
top++;
}
}
}
}
}
int main() {
// 定义一个图像
char image[MAX_SIZE][MAX_SIZE] = {
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
{'#', '.', '#', '#', '#', '#', '#', '#', '.', '#'},
{'#', '.', '#', '.', '.', '.', '.', '#', '.', '#'},
{'#', '.', '#', '.', '#', '#', '.', '#', '.', '#'},
{'#', '.', '#', '.', '.', '#', '.', '#', '.', '#'},
{'#', '.', '#', '#', '#', '#', '#', '#', '.', '#'},
{'#', '.', '.', '.', '.', '.', '.', '.', '.', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
// 图像的宽和高
int width = 10;
int height = 9;
// 打印原图像
printf("Original Image:\n");
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
printf("%c", image[i][j]);
}
printf("\n");
}
// 进行种子填充
seedFill(4, 4, '.', '*', image, width, height);
// 打印填充后的图像
printf("Filled Image:\n");
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
printf("%c", image[i][j]);
}
printf("\n");
}
return 0;
}
```
该代码定义了一个名为`seedFill`的函数来实现种子填充,该函数接受要填充的点的坐标、目标颜色、替换颜色、图像数据以及图像的宽和高作为参数。在函数内部,使用一个栈来保存待填充的坐标,循环取出栈中的坐标并进行填充,同时将周围未填充的点入栈。在主函数中,定义了一个图像并打印出原图像和填充后的图像。
阅读全文