求数组中1的区域

jenhon 2012-11-26 06:20:29
有个二维数组,全部由 0 1 组成,想求出所有包含1的最小方形区域

比如:
0 1 2 3 4 5 6 7 8 9 10111213141516....
0> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1> 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2> 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3> 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
4> 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
5> 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
6> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
7> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
9> 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
10>0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
11>0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
12>0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

需要得到4(或者5)对坐标:
(2,1)-(4,5);(9,5)-(9,5);(10,9)-(11,9);
最后一块可以有2种结果:
(11,10)-(14,11)
或者:(13,10)-(14,10);(11,11)-(12,11)

最小区域的要求不是很严格,效率优先。

先谢谢大家了。
...全文
221 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jenhon 2012-11-30
  • 打赏
  • 举报
回复
算法的结果跟我原先想的反复补充三角1结果一样,碰到大L型,还是很难优化成为 横竖 2个长方形。 再次谢谢。
jenhon 2012-11-30
  • 打赏
  • 举报
回复
非常感谢楼上! 你的方法给我很大的启发。 谢谢。
jenhon 2012-11-29
  • 打赏
  • 举报
回复
引用 11 楼 lhylhy 的回复:
引用 6 楼 jenhon 的回复: 引用 4 楼 lhylhy 的回复:用穷举法,最后比较大小。 穷举?跟这个有什么关系? 列出所有可能的方形。
穷举也要找有穷的吧——列出所有可能的方形?10*10的方阵,就2的100次方比较了,更别说几k*几k.....
蓝色光芒 2012-11-29
  • 打赏
  • 举报
回复
用这方法,对你题目中的数据跑出来的结果是 ( 2 , 1 ) - ( 4 , 5 ) ( 9 , 5 ) - ( 9 , 5 ) ( 9 , 9 ) - ( 14 , 11 ) 因为我还没有写 显然需要最后进行一次整理,对这个结果进行整理,分析那些左上角为0或者右下角为0的,再进一步划分才可以
蓝色光芒 2012-11-29
  • 打赏
  • 举报
回复
函数(一个区域Rect) var List : array of TRect begin 对这个Rect横向扫描,用行全部为0的进行分割,只保留有含有1的连续的行,得到一个Rect,把这个Rect写入List中 循环这个List递归 Exit 如果无法分割,就尝试进行纵向分割,只包含有1的连续的列坐标,得到一个Rect,把这个结果写入List 循环这个List递归 Exit 如果还是无法分割,直接写入结果列表中. end; 函数(整个区域)即可得到一个相对很小的结果 但是这样有个问题 011000 001110 000100 得到的结果是 (1,0)-(4,2) 显然[4,2]=0,显然需要最后进行一次整理,对这个结果进行整理,分析那些左上角为0或者右下角为0的,再进一步划分才可以.
lhy 2012-11-29
  • 打赏
  • 举报
回复
引用 12 楼 jenhon 的回复:
引用 11 楼 lhylhy 的回复:引用 6 楼 jenhon 的回复: 引用 4 楼 lhylhy 的回复:用穷举法,最后比较大小。 穷举?跟这个有什么关系? 列出所有可能的方形。 穷举也要找有穷的吧——列出所有可能的方形?10*10的方阵,就2的100次方比较了,更别说几k*几k.....
怎么可能2的100次方,55的平方而已。
lhy 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 jenhon 的回复:
引用 4 楼 lhylhy 的回复:用穷举法,最后比较大小。 穷举?跟这个有什么关系?
列出所有可能的方形。
lhy 2012-11-27
  • 打赏
  • 举报
回复
用穷举法,最后比较大小。
SQLDebug_Fan 2012-11-27
  • 打赏
  • 举报
回复
是实现广度和深度搜索?是想得到最优算法还是简单实现?
jenhon 2012-11-27
  • 打赏
  • 举报
回复
引用 8 楼 sz_haitao 的回复:
这个好像简单: 分别计算1开始出现的行x、列y,和1最后出现的行a、列b 这个方框坐标就是:(x,y)-(a,b)
你的方法好像不是很正确啊,像: 0010 0110 0100 就不正确了。
haitao 2012-11-27
  • 打赏
  • 举报
回复
引用 8 楼 sz_haitao 的回复:
这个好像简单: 分别计算1开始出现的行x、列y,和1最后出现的行a、列b 这个方框坐标就是:(x,y)-(a,b)
我求的是 包含所有1的最小方形区域
haitao 2012-11-27
  • 打赏
  • 举报
回复
这个好像简单: 分别计算1开始出现的行x、列y,和1最后出现的行a、列b 这个方框坐标就是:(x,y)-(a,b)
jenhon 2012-11-27
  • 打赏
  • 举报
回复
目前想到的办法就是在三角1的0反复填充1,直到图形不出现三角1的情况: 01 10 11 11 11 11 10 01 这个方法,除了某些情形效率不高之外,像L图形,本来2个矩形就可以,给填充成大矩形,增加了不需要的东西。
jenhon 2012-11-27
  • 打赏
  • 举报
回复
引用 4 楼 lhylhy 的回复:
用穷举法,最后比较大小。
穷举?跟这个有什么关系?
jenhon 2012-11-27
  • 打赏
  • 举报
回复
引用 3 楼 SQLDebug_Fan 的回复:
是实现广度和深度搜索?是想得到最优算法还是简单实现?
简单实现就好。
jenhon 2012-11-26
  • 打赏
  • 举报
回复
我需要的是具体位置的坐标,不是数量。

谢谢了。
hsfzxjy 2012-11-26
  • 打赏
  • 举报
回复
求左右最长距离,上下最长距离,求max

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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