社区
数据结构与算法
帖子详情
牛人请进,一道小题,给个思路
c372662316
2011-07-11 08:14:12
现有4*4的小正方形组成的64*64的大正方形,每个小正方形中都放有一个数字,现要把其中放数字为0的小正方形给圈出来(假设把它看成64*64的图像,即外围像素赋值为255),并且若有相邻的小正方形则把他们合并,只圈出外围,而且能随意控制只圈出有两个,三个或其他任意个相邻个数值为0的正方形,有没哪位大牛支个招阿,讲下思路?
...全文
168
11
打赏
收藏
牛人请进,一道小题,给个思路
现有4*4的小正方形组成的64*64的大正方形,每个小正方形中都放有一个数字,现要把其中放数字为0的小正方形给圈出来(假设把它看成64*64的图像,即外围像素赋值为255),并且若有相邻的小正方形则把他们合并,只圈出外围,而且能随意控制只圈出有两个,三个或其他任意个相邻个数值为0的正方形,有没哪位大牛支个招阿,讲下思路?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
木人回复阿//,随便说几句也好啊
深入理解Android:卷I--详细书签版
另外,如果大家发现本书存在纰漏或有必要
进
一步探讨的地方,
请
发邮件给我(fanping.deng@gmail.com),我会尽快回复。非常乐意与大 家交流。 本书主要内容 全书一共10章,其中一些重要章节中还设置了...
程序员的十个层次(
牛人
成长之路)(转)
自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员...要解决这个问题,必须先知道程序员有多少种技术层级,每个
又一
牛人
的求职经历
应同学要求,最近准备书写系列文章“我的求职历程及经验分享”,
请
大家关注,谢谢! (一):求职历程总结2007 年1月10日,随着在三方协议上郑重签下自己的名字,我的求职历程终于划上了一个圆满的句号。在这三个月...
绝对受用的求职经验分享,是天津大学一
牛人
写的,很
他们都有一个传统,就是大家互相帮助,互相分享成功 经验,可是我们这里没有,在天大,大家更多的是抱怨,抱怨被鄙视,抱怨
牛人
抢了你的 机会,可是却从来没有自己身上去找原因,没有去想想:为什么你会被鄙视,为...
C++面试题
1.构造一个类MySingleton,使该类只能存在一个实例.
思路
: 将构造函数写为private的,然后通过一个成员静态函数来调用构造函数即可:) 例: #include "iostream.h" class MySingleton { private: static ...
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章