各位高手,我有一难题,高分求助!!

lihobby 2003-06-28 09:57:16
用C语言描述的数据结构问题--种子填充的递归实现,用顺序栈实现.

请各位高手 一定一定不吝赐教, 小弟先谢过!!!!

(要把程序写出来,要写的完整哦)

我只能给100分 但解决后 一定另外再给分!!
...全文
101 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2003-07-01
  • 打赏
  • 举报
回复
递归方式的种子填充算法的描述
假定要填充区域的便捷使用一个特定的颜色所表达,这个颜色是BorderColour
给定一个包含在被填充区域内的点,(X,Y)
void SeedFill(int x, int y)
{
if (Colour(x,y)!=FillColour) && (Colour(x,y)!=BorderColour)
{
SetPixel(x,y);
SeedFill(x-1,y);
SeedFill(x+1,y);
SeedFill(x,y-1);
SeedFill(x,y+1);
}
}
这个算法的效率没有扫描线的算法高。

前面给的例子就是使用顺序栈实现的,只不过边界检测方法是按照矩形边界判断的。
对于你的任意边界要求,把判断(实际就是那个循环)改造成为上面的方式就可以了。
HUNTON 2003-07-01
  • 打赏
  • 举报
回复
先搜集再说
lihobby 2003-06-30
  • 打赏
  • 举报
回复
填充区域可以是多边形区域,也可以是圆形区域.
寻开心 2003-06-30
  • 打赏
  • 举报
回复
/*
* fill.c : simple seed fill program
* Calls pixelread() to read pixels, pixelwrite() to write pixels.
*/

typedef struct { /* window: a discrete 2-D rectangle */
int x0, y0; /* xmin and ymin */
int x1, y1; /* xmax and ymax (inclusive) */
} Window;

typedef int Pixel; /* 1-channel frame buffer assumed */

Pixel pixelread();

typedef struct {short y, xl, xr, dy;} Segment;
/*
* Filled horizontal segment of scanline y for xl<=x<=xr.
* Parent segment was on line y-dy. dy=1 or -1
*/

#define MAX 10000 /* max depth of stack */

#define PUSH(Y, XL, XR, DY) /* push new segment on stack */ \
if (sp<stack+MAX && Y+(DY)>=win->y0 && Y+(DY)<=win->y1) \
{sp->y = Y; sp->xl = XL; sp->xr = XR; sp->dy = DY; sp++;}

#define POP(Y, XL, XR, DY) /* pop segment off stack */ \
{sp--; Y = sp->y+(DY = sp->dy); XL = sp->xl; XR = sp->xr;}

/*
* fill: set the pixel at (x,y) and all of its 4-connected neighbors
* with the same pixel value to the new pixel value nv.
* A 4-connected neighbor is a pixel above, below, left, or right of a pixel.
*/

fill(x, y, win, nv)
int x, y; /* seed point */
Window *win; /* screen window */
Pixel nv; /* new pixel value */
{
int l, x1, x2, dy;
Pixel ov; /* old pixel value */
Segment stack[MAX], *sp = stack; /* stack of filled segments */

ov = pixelread(x, y); /* read pv at seed point */
if (ov==nv || x<win->x0 || x>win->x1 || y<win->y0 || y>win->y1) return;
PUSH(y, x, x, 1); /* needed in some cases */
PUSH(y+1, x, x, -1); /* seed segment (popped 1st) */

while (sp>stack) {
/* pop segment off stack and fill a neighboring scan line */
POP(y, x1, x2, dy);
/*
* segment of scan line y-dy for x1<=x<=x2 was previously filled,
* now explore adjacent pixels in scan line y
*/
for (x=x1; x>=win->x0 && pixelread(x, y)==ov; x--)
pixelwrite(x, y, nv);
if (x>=x1) goto skip;
l = x+1;
if (l<x1) PUSH(y, l, x1-1, -dy); /* leak on left? */
x = x1+1;
do {
for (; x<=win->x1 && pixelread(x, y)==ov; x++)
pixelwrite(x, y, nv);
PUSH(y, l, x-1, dy);
if (x>x2+1) PUSH(y, x2+1, x-1, -dy); /* leak on right? */
skip: for (x++; x<=x2 && pixelread(x, y)!=ov; x++);
l = x;
} while (x<=x2);
}
}


1992年的作品
dcyu 2003-06-29
  • 打赏
  • 举报
回复
ft @_@
lihobby 2003-06-29
  • 打赏
  • 举报
回复
偶也不太明白

计算机图形学里面 有介绍
mmmcd 2003-06-29
  • 打赏
  • 举报
回复
程序简单。

你要填充什么图形?仅仅是一个二维数组来模拟的图形?这个数组有多大?
BlueSky2008 2003-06-29
  • 打赏
  • 举报
回复
那就把不是递归的改成递归的。
bache1115 2003-06-29
  • 打赏
  • 举报
回复
什么是种子填充????

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧