求救,一道图像还原题纠结我N久了。。。

KPRF2009 2011-07-20 11:14:45
2008年5月12日14:28分。四川发生了8.0级大地震,都江堰成了重灾区,当然XX学院也成了重灾区中一所大学,很多建筑物都被严重的损坏了。地震后,我们需要来修复受损的房屋,XX学院从电脑里找出原来的设计图,现在需要你来修复...
现在给你2张平面图(最大:640X480),第一张是受损后的平面图,第二张是受损前的平面图。然后给你一些模块平面图(最大:128X128,最多128种),这些模块平面图可以使用无数次,这些图上只有0,1组成,当你覆盖上去的时候就记修复1次,我们希望用最少的修复次数去完成修复即与受损前的平面图相同。模块覆盖上去后的数字计算为xor (注:异或1 xor 1=0,0 xor 0=0,1 xor 0=1,0 xor 1=1。)值表示。如图:

注:
A:模块平面图
B:受损后的平面图
C:修复后的图

如图:

输入:给你一个N,表示有N组数据,然后每组数据:
n1,m1表示受损后的平面图的长宽。
然后n1行m1列表示受损后的平面图。
然后n1行m1列表示受损前的平面图
然后一个M,表示有M个模块平面图,然后以下是每个模块图数据:
n2,m2表示模块平面图的长宽
然后n2行m2列模块平面图。
输出:
每组数据输出一行case T: K
T表示第几组数据,K表示修复完成最少需要的修复次数(如果大家想不出来最优解,想想如果不完全恢复(恢复了大部分),最少修复次数)。

样例:
输入:
1 (表示一组数据)
3 4(修复前/后图的长宽)
0 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
0 1 1 1
1 1 1 1
2 (模块图的数量)
2 2 (模块图1的长宽)
1 0 (模块图1的图)
0 0
3 1 (模块图2的长宽)
0 (模块图2的图)
1
1



输出:case 1:1
...全文
195 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
KPRF2009 2012-02-27
  • 打赏
  • 举报
回复
此问题已经解决,没能完全恢复。。。。


最后本人采用的是模糊算法,尝试去覆盖,通过恢复数减去破坏数算出一个权值后,当这个权值超过我设置的权值后进行覆盖。。。。

设置的权值是通过图像和小图章的大小和小图章中1的个数算出来的。。。。

这种方法。。。还算高效。。。。。。。
KPRF2009 2011-07-24
  • 打赏
  • 举报
回复
顶上去,等待高人出现
KPRF2009 2011-07-21
  • 打赏
  • 举报
回复
顶上去
qybao 2011-07-20
  • 打赏
  • 举报
回复
例子中的
case 1:1
的第一组,应该是
3 1 (模块图2的长宽)
0 (模块图2的图)
1
1
还是
2 2 (模块图1的长宽)
1 0 (模块图1的图)
0 0
如果是上,那就表示组编号是以0下标开始的,是这样吧?
如果是下,那么好象要修复2次吧
zl3450341 2011-07-20
  • 打赏
  • 举报
回复
看来是关于算法设计的,坐等人了
zyp_weihai 2011-07-20
  • 打赏
  • 举报
回复
关于算法的,没学过,帮顶
zwlweb 2011-07-20
  • 打赏
  • 举报
回复
帮顶。。。
KPRF2009 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qybao 的回复:]
引用 11 楼 kprf2009 的回复:
引用 5 楼 qybao 的回复:
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图xor一下,应该可得该修复的地方,然后判断修复模块平面图,看能满足修复地方的最小模块数
如LZ的例子

修复前
0 1 1 1
1 1 1 1
1 1 1 1

修复后
1 1 1 1
0 1 1 1
1 1 1 1

修复前……
[/Quote]

那枚举量好大哦,你首先要枚举小模块,然后再枚举右上角坐标,然后你还要算是否可以减少1
减少了多少个。
从这里面找到一个模块放上去的时候,你又要重新枚举小模块和右上角坐标(因为原图被小模块覆盖后可以引起其他地方的0变成1,纠结啊。。。。)
KPRF2009 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qybao 的回复:]
引用 11 楼 kprf2009 的回复:
引用 5 楼 qybao 的回复:
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图xor一下,应该可得该修复的地方,然后判断修复模块平面图,看能满足修复地方的最小模块数
如LZ的例子

修复前
0 1 1 1
1 1 1 1
1 1 1 1

修复后
1 1 1 1
0 1 1 1
1 1 1 1

修复前……
[/Quote]

那枚举量好大哦,你首先要枚举小模块,然后再枚举右上角坐标,然后你还要算是否可以减少1
减少了多少个。
从这里面找到一个模块放上去的时候,你又要重新枚举小模块和右上角坐标(因为原图被小模块覆盖后可以引起其他地方的0变成1,纠结啊。。。。)
qybao 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kprf2009 的回复:]
引用 5 楼 qybao 的回复:
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图xor一下,应该可得该修复的地方,然后判断修复模块平面图,看能满足修复地方的最小模块数
如LZ的例子

修复前
0 1 1 1
1 1 1 1
1 1 1 1

修复后
1 1 1 1
0 1 1 1
1 1 1 1

修复前,修复后xor,得
1 0 0 0
1 0……
[/Quote]
这个没办法,你给定的模块如果不能匹配,就有可能会出现不需要修复的地方需要修复
所以,你每次修复后,都要把修复的结果和最终修复结果进行xor来判断是否还存在1,如果存在,继续修复,直到每次的修复结果和最终结果xor不存在1为止。
或者,就应该在不改变不需要修复的地方的情况下,让修复结果和最终修复结果xor存在的1最少,也就是恢复最大部分。

KPRF2009 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qybao 的回复:]
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图xor一下,应该可得该修复的地方,然后判断修复模块平面图,看能满足修复地方的最小模块数
如LZ的例子

修复前
0 1 1 1
1 1 1 1
1 1 1 1

修复后
1 1 1 1
0 1 1 1
1 1 1 1

修复前,修复后xor,得
1 0 0 0
1 0 0 0
0 0 0 0

可知……
[/Quote]


你考虑那种情况了吗?就是本来不需要修复的地方B,你用小模块修复了地方A,引起了地方B也需要修复了。
lyhmy 2011-07-20
  • 打赏
  • 举报
回复
菜鸟不懂,只能帮顶。。。
KPRF2009 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qybao 的回复:]
例子中的
case 1:1
的第一组,应该是
3 1 (模块图2的长宽)
0 (模块图2的图)
1
1
还是
2 2 (模块图1的长宽)
1 0 (模块图1的图)
0 0
如果是上,那就表示组编号是以0下标开始的,是这样吧?
如果是下,那么好象要修复2次吧
[/Quote]


用模块2修复的

0
1
1
这个模块修复的,模块2中的0已经放图外面了(允许放在外面)。

KPRF2009 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 audia4l 的回复:]
这个问题太简单了,不值得问。
[/Quote]

额?难道大牛有思路?
AudiA4L 2011-07-20
  • 打赏
  • 举报
回复
这个问题太简单了,不值得问。
caishenfans 2011-07-20
  • 打赏
  • 举报
回复
友情帮顶
qybao 2011-07-20
  • 打赏
  • 举报
回复
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图xor一下,应该可得该修复的地方,然后判断修复模块平面图,看能满足修复地方的最小模块数
如LZ的例子

修复前
0 1 1 1
1 1 1 1
1 1 1 1

修复后
1 1 1 1
0 1 1 1
1 1 1 1

修复前,修复后xor,得
1 0 0 0
1 0 0 0
0 0 0 0

可知修复地方在
1
1
处,即不为0的地方需要修复

然后根据修复模块平面图来判断修复需要模块数
如果是
2 2 (模块图1的长宽)
1 0 (模块图1的图)
0 0
修复模块只有一个1,所以至少需要2个

如果是
3 1 (模块图2的长宽)
0 (模块图2的图)
1
1
修复模块有2个1,再判断修复模块的方向和需要修复地方的方向,可以匹配,所以只需要1次

依此类推,采用回溯法找到检查所有需要修复的地方,找到修复模块最小需要个数

皮特张 2011-07-20
  • 打赏
  • 举报
回复
呵呵,菜鸟,只能顶贴了。
tt2com 2011-07-20
  • 打赏
  • 举报
回复
mark下 回家看

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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