牛人请进,一道小题,给个思路

c372662316 2011-07-11 08:14:12
现有4*4的小正方形组成的64*64的大正方形,每个小正方形中都放有一个数字,现要把其中放数字为0的小正方形给圈出来(假设把它看成64*64的图像,即外围像素赋值为255),并且若有相邻的小正方形则把他们合并,只圈出外围,而且能随意控制只圈出有两个,三个或其他任意个相邻个数值为0的正方形,有没哪位大牛支个招阿,讲下思路?
...全文
168 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
c372662316 2011-07-14
  • 打赏
  • 举报
回复
哎,还是按自己的方法解决算了
c372662316 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 liufang421 的回复:]

所有像素上标记,0的小方块里面的像素设为1,然后根据标记查找联通区,是不是要这个效果?
[/Quote]不是,我要把两张图像上特征不同的区域圈出来,每个区域为4*4的像素,当两各区域相邻时,把他们合并为一个区域?其中标记0表示对应的区域是不同的,即需圈出的区域
yaoweijq 2011-07-12
  • 打赏
  • 举报
回复
floodfill么
liufang421 2011-07-12
  • 打赏
  • 举报
回复
所有像素上标记,0的小方块里面的像素设为1,然后根据标记查找联通区,是不是要这个效果?
c372662316 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dreadstone 的回复:]

typedef struct MySq
{
int iNum; //存放的数字,如果是0就圈
int iCount; //存放这个正方形跟几个其他正方形圈一起了
MySq* next; //与他相邻的下一个正方形
MySq* pre; //与他相邻的上一个正方形
} MySq;

MySq sq[16][16]; //定义小正方形
int borderB……
[/Quote]
相当的麻烦阿
c372662316 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xibeitianlang 的回复:]

边界的定义是什么,比如一个孤立的0,它的边界是4个格还是8个格,要先说明。
如果是4个格,则在扩展标记的时候,可以同时标记边界;如果是8个格,还要把外边界连通。
[/Quote]
恩,感觉是我没讲明白,是这样的,其实我做的是图像识别,用局部特征来判断两张图像的不同,4*4的小方块就是16个像素点,我已经把两张图像对应不同的4*4像素区标记为0,所以我只要判断某区域标记为0,就把最外层的12个像素素点的值赋为255;
我还是用的栈的思想,不过我用vector来实现栈,把找到一个联通区域中块放到一个向量中,以便用vector.size()来实现圈出几块以上的区域,当把联通区域找好后,我想这样,取出某联通区域第一块,然后判断他的上下左右在不在这个连通区域,如果上边在,怎上上边4个像素值不用改变,依次这样。。。
希望提下意见
dreadstone 2011-07-12
  • 打赏
  • 举报
回复
typedef struct MySq
{
 int iNum; //存放的数字,如果是0就圈
 int iCount; //存放这个正方形跟几个其他正方形圈一起了
MySq* next; //与他相邻的下一个正方形
MySq* pre; //与他相邻的上一个正方形
} MySq;

MySq sq[16][16]; //定义小正方形
int borderBuffer[17][17]; //定义每个小正方形的边

从左往右逐行遍历sq,有sq[x][y].iNum == 0的就把对应的4个borderBuffer=1。
然后看他上边跟左边的小正方形的iNum是不是为0,是的话就加入链表,更新链表里所有正方形iCount值。对应的borderBuffer值修改(去掉一条边)。

第二次遍历sq,如果sq[x][y].iCount不符合要求就把对应的borderBuffer值改为0。

然后根据borderBuffer画边。

好像太麻烦了,可能有更好的办法。
xibeitianlang 2011-07-11
  • 打赏
  • 举报
回复
边界的定义是什么,比如一个孤立的0,它的边界是4个格还是8个格,要先说明。
如果是4个格,则在扩展标记的时候,可以同时标记边界;如果是8个格,还要把外边界连通。
c372662316 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xibeitianlang 的回复:]

思路有一个:
从上到下,从左到右,先找到一个数字为0的小正方形,以上右下左的顺序扩展,扩展过的地方做上标记,不能再扩展就原路返回,直至返回最先找到的小正方形为止,一个联通区域完成;
再找第二个,...,到找不到0结束。
[/Quote]
首先谢谢回答,我认为可以这样来实现求连通区域,用两个循环控制行列块,然后从第一块开始找为0的块,每找完一块,把它标记为已找,当发现某块为0时,把它的上下左右为0的块进栈,然后标记为已找,弹出栈顶,再将此块上下左右为0的快进栈依次这样找完所有联通区域,
问题是怎么把联通区域的外边界和内边界区分开来,难道说要依次判断某块和联通区内其他各块的的位置关系吗,感觉相当麻烦阿
xibeitianlang 2011-07-11
  • 打赏
  • 举报
回复
思路有一个:
从上到下,从左到右,先找到一个数字为0的小正方形,以上右下左的顺序扩展,扩展过的地方做上标记,不能再扩展就原路返回,直至返回最先找到的小正方形为止,一个联通区域完成;
再找第二个,...,到找不到0结束。
c372662316 2011-07-11
  • 打赏
  • 举报
回复
木人回复阿//,随便说几句也好啊

33,008

社区成员

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

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