有难度的算法设计,keywords:覆盖 矩阵 棋盘 连通 网格

wlpwind 2005-01-18 07:58:33
一个50X50的矩阵,开始时矩阵里每一项的值为EMPTY或RED。你可以将矩阵里任意一个位置的值(无论是EMPTY或RED)改为BLACK,如果BLACK上下左右四个位置中有RED,则将该RED值改为EMPTY(没错,改为EMPTY,而不是BLACK),目标是通过尽可能少次数的改动,将矩阵里的RED消除,并且所有的BLACK相连通。
(注:相连通--如果将BLACK点看作路径,相连通就是指我们可以从一个BLACK点通过上下左右沿路径走动走到任何一个BLACK点上)。

输入:input.txt
格式:50行50列(用0表示EMPTY,1表示RED;每一行表示矩阵的一行,0 1间没有间隔)
例:见最后。

输出:output.txt
格式:第一行为一个数字,表示改动的次数;后面跟50行50列,标示改动后矩阵的值(用0表示EMPTY, 2表示BLACK;每一行表示矩阵的一行,0 2间没有间隔)
例略。

****说明****:
1.解答请在贴出程序的同时,请贴出后面输入例子的改动次数,以便于我们比较效果,最好说明程序的复杂度或运行时间。
2.解答请不要贴输出的矩阵,会导致看贴困难。
3.有个相关讨论的链接,建议不要看,可能反而糊涂:
http://community.csdn.net/Expert/topic/3733/3733723.xml?temp=.7722437


输入input.txt举例。
10100010001010000001011001000110000000100100011011
00001000011000101010011001111000111010000001010010
00101000001100001000111100101011111001010101011010
10010001010000100100100001010000101000110000111101
00011010100000000000101001101001011001100010001101
00100100101000000100011100100110100001111101010001
00001000111110001100110010000001010010111001001000
01010101000000000000110000010000010101000000111010
10101000110110010000100000101101111000001011110000
00010101001100111100101001010000011010011110110010
01001100001010010101110010100011010100011010101000
01001111000001010011011000110011000111010011110100
11110001110100100011010110000111111001001111100010
01001101101110101001001100001111011101101100011011
11000011001101001011010001001010001101100110010010
01100000011101100010000101100000100000100111001010
10010010110011100110000100001111100100100011111000
01110110111010111001010011010101000000001110110110
00000111110010010010101111001010101111101100100000
11010100110011000101000010000010000001101000100100
01110011111010111111000110000011100111110011100111
00000010100011010100110010110000000000000101100000
01010110010000110001000000000000000010001101011011
11010101011000000000011011011000000100111100000010
01000000011100010100000010101110011010011001111010
01111000001010000100011110000010011101110100101100
11000010001010011000101001001110110100111000000111
11100000100001010110010010000010010100001000111110
10010010110000100000101001110101001100101111100101
01011001001010100010100011001000001000001011101000
00001000011111110100000111001100000000100010001010
00001000010011100100001001001000001111110101000011
01001111011000100010100100010110011100010001110011
11000010111111001000000000001000101110111000001010
01000111010101010010011100110011101101000011100100
00110001010110010110001101100000111001010001010110
00100011110000011100010011110100000001111000010110
10001000011101000100011101000111001111000111110010
10100000001100010001111100011110001001100010100101
00011100001000010010111000001001010000101100100010
00101010000010001100100001100010010000010110110001
01110100010010010010001110010011001110010101010010
01000001111010000011000100001111000000000100000011
11011001011000111101001101010000000011110101000100
01111100010110100010010011100000001000110100000001
11111111000111001100001000010110001101001011101100
11101100100000100001001101010001010101101101010001
01000100000001100110100010000101010100100011000110
00000101111000000100000111100011000000100000101101
00110110001010011011101011110000000010011110000001







...全文
201 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlpwind 2005-01-22
  • 打赏
  • 举报
回复
to mysword:同二分图的最大匹配(亦是最小顶点覆盖)不完全相同吧?黑子可以放在白子的位置上。
http://community.csdn.net/Expert/topic/3733/3733723.xml?temp=.7722437 中mathe提过,还没有考虑怎么转换。

我是外围随便找一个点开始,我觉得对于红点组成一个连通块来说,局部的最优覆盖连通(比如以当前点为中心的5X5矩阵)可能会导致最终的最优。

不同的连通块连接就是通过往外扩散(宽度优先)找最短路径。
寻开心 2005-01-22
  • 打赏
  • 举报
回复
和楼上的想法类似
在楼主的另外的一个帖子里面提到了一种解决方案
1 就是用黑子占据原来白子的所有地方,作为初始化数据
2 把各个区域边界提取出来,依次向内收缩1,4,7,10....个单位,形成新的边界
3 然后把所有的孤立边界合并起来, 再建立中间的连通

这种收缩策略,可以保证和其他区域之间的互相不干扰性.
但是具体在实现的时候需要仔细考虑

在另外那个帖子当中,楼主认为这个答案更具备一般性, 不具备特殊性
实质上, 这只是一个一般化的问题了,需要考虑很多的特殊情况
比如对于直线形的,就无法内收缩了,保留即可.
比如对于一个正方形的边界区域,收缩后不会也是一个正方形,因为在角点的地方,因为黑子控制规则的因素使得内不正方形,无法控制这个角点, 必须特殊的处理


如同mathe的说法, 除非很空闲, 否则没有谁会花费时间做这个实现的.
gnefuil 2005-01-22
  • 打赏
  • 举报
回复
能不能这样:
如果不要求黑子连通的话,问题本身是二分图的最大匹配(亦是最小顶点覆盖),用匈牙利算法或者网络流都可以搞定。结果得到了一个棋盘,里面的黑子一块一块的,不完全连通。然后再计算每个连通块之间的最短距离,用最小生成树算法得到一块连通的黑子。

wlpwind 2005-01-21
  • 打赏
  • 举报
回复
可能不是最优,不知差多少。
wlpwind 2005-01-21
  • 打赏
  • 举报
回复
原来矩阵1037个红点,下面这种方法使用839个BLACK实现连通覆盖。


02000000000200000000200000000020000000000000022220
02000220002200020002202222222222200002222220020020
02000220002222220000222002020000222000200020020000
02200022002000020000202002200000020000200022222000
00220002202000022200002000220000220000200002002222
00200000222200000200002000020020020000222002200000
00200222200200000200022200020022220000000000220000
22200200000200000200020000020000022220000000220000
00222202222200000200020000022000220020000000200220
00002200002000022200020000000000020020002220200200
00002000000000022000020002000020000020002020222200
02002000000020000002220022200020000022002022200000
02222222200020000002000020000022222002002000000000
02000002000220222202000220000220002222222200020020
02000002222220000222222200000200000000200200020020
02000000002022000020000222000202000000200200020020
02200000022022220020000002000222000000000202220020
00200020020020020220000022200020000200000202000020
00200020020020020200022220000222000222200202000020
02200022020020020220000020000020000020200202000020
00200022220020022220000020000022000020222202000020
00000020020020020000000020020000000020000222000020
00000020020000020000220020020000000000002220002220
02022220222000020000020222220000000000022000000020
02020020002000000000020200022000000200020000000020
02220020002200000200022200002220222200222002222020
02000000000222222200020000000022202000002000202222
02000000000000002200020002000002202000002000200202
02200002200000000000020002200000002000022220200000
00220000220000200000020002000200000000000022220000
00020000022222200020020022222200000000000002020000
00020000020000222220020000000200000000200022200020
00222200220000000000022000002200002220200000200220
02200200022220000000002000000222000202220000222200
00200220020222222000002000200002222222000002020000
00200020020020002220002000200000000002000002020200
00200022222022002200002222222000000002020002222220
02200220002000000000002000002220000222222220200200
22002200002000000000222000002000000200200020200000
00002000000000020002200000000000200000000220200002
00000000000022222000000000000002200000000222220022
00200020000020020000000222200002000220020200000020
00200022220000020020000200222222000020020200000020
02200020020000022220000220000200000022222200000020
00202020000022220200000022000200000002022002000020
02222220000220000200020002200200002222202222222220
02000200000000000222222000200222222200200020000020
00000200200022222200002000200000200000200020000020
00022222222220000200002222220002200022200222000222
00020000020000002222000000000000000000002200000000
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
up,
好像csdn牛人越来越少了。
是不是因为csdn的专家分泛滥 搞的比较厉害的人没兴趣了?
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
怎么没人做啊?
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
不要歇斯底里。------这句话很不好听,我只是很希望有人回应而已,但是并不急。这的确是我所做课题中遇到的问题,但我论文已经写完了,这个问题这几天在考虑而已。


这种问题,除非有实用价值,以不沾边为妙,否则浪费时间太多。
-------可以理解,因为在这里遇到困难的问题,又没有时间,我也不会去搞。但这个问题应该是有实用价值的。


--------------------
如果前面关于牛人的话,冒犯了这里热心于解决问题的朋友,很抱歉。
zzwu 2005-01-20
  • 打赏
  • 举报
回复
这种问题,除非有实用价值,以不沾边为妙,否则浪费时间太多。
mathe 2005-01-20
  • 打赏
  • 举报
回复
不要歇斯底里。这是你的工作:)对于别人来说,有兴趣可能会看看,给你提些建议,没有兴趣就过去了。自己的问题还要自己动手:)
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
??
wlpwind 2005-01-19
  • 打赏
  • 举报
回复
可以只考虑消除RED--只考虑消除RED,不用考虑BLACK连通。
wlpwind 2005-01-19
  • 打赏
  • 举报
回复
up.
可以只考虑消除RED,贴答案时说明这一点即可。

33,006

社区成员

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

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