日期:2014-05-20  浏览次数:20730 次

求救,一道图像还原题纠结我N久了。。。
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


------解决方案--------------------
看来是关于算法设计的,坐等人了
------解决方案--------------------
例子中的
case 1:1
的第一组,应该是
3 1 (模块图2的长宽)
0 (模块图2的图)
1
1
还是
2 2 (模块图1的长宽)
1 0 (模块图1的图)
0 0
如果是上,那就表示组编号是以0下标开始的,是这样吧?
如果是下,那么好象要修复2次吧

------解决方案--------------------
mark下 回家看
------解决方案--------------------
呵呵,菜鸟,只能顶贴了。
------解决方案--------------------
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图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

修复模块有2个1,再判断修复模块的方向和需要修复地方的方向,可以匹配,所以只需要1次

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


------解决方案--------------------
友情帮顶
------解决方案--------------------
这个问题太简单了,不值得问。
------解决方案--------------------
菜鸟不懂,只能帮顶。。。
------解决方案--------------------
探讨
引用:
不知道我理解的对不对,大概说下思路

修复前,修复后的平面图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……

------解决方案--------------------
帮顶。。。
------解决方案--------------------
关于算法的,没学过,帮顶