Solution #1: Given a border separated region within a canvas, a "Paint Fill" function fills the region with a given color when the user clicks inside that region. Essentially we color all the pixels starting from the clicked pixel till we hit border all around. This is a classic recursion problem. The code below first implements a canvas of size=50x50 and then initializes it with Black color(1), creates a region within the canvas and fills it with white color(0) and then calls the "fill" function to fill this region with red color(5) recursively and finally prints the canvas.
enum
{
WHITE = 0,
BLACK = 1,
RED = 5
};
void printCanvas(int canvas[][50], int canSize)
{
int x,y;
for(y=0; y < canSize; y++)
{
for(x=0; x < canSize; x++)
{
printf("%d ", canvas[y][x]);
}
printf("\n");
}
printf("\n");
}
void createBorder(int canvas[][50])
{
int x,y;
for(y=5; y<45; y++)
{
for(x=5; x<45; x++)
{
canvas[y][x] = WHITE;
}
}
}
void init_canvas(int canvas[][50])
{
int x,y;
for(y=0; y<50; y++)
for(x=0; x<50; x++)
canvas[y][x] = BLACK;
}
void fill(int canvas[][50], int canSize, int x, int y)
{
if(canvas == NULL)
return;
if(((x < canSize) && (x >= 0)) && ((y < canSize) &&
(y >= 0)) && (canvas[x][y] != BLACK) && (canvas[x][y] == WHITE))
{
canvas[x][y] = RED;
fill(canvas, canSize, x, y+1);
fill(canvas, canSize, x, y-1);
fill(canvas, canSize, x+1, y);
fill(canvas, canSize, x-1, y);
}
}
void main()
{
int canvas[50][50] = {0,};
init_canvas(canvas);
createBorder(canvas);
fill(canvas, 50, 25, 25);
printCanvas(canvas, 50);
}
No comments:
Post a Comment