棋盘中棋子覆盖 并连通的算法问题(高分)

wlpwind 2005-01-18 09:57:15
加精
(说明:不是下棋的问题,只是用棋盘和棋子表示; 不一定写可运行程序,伪代码或自然语言均可,所用数据结构和解决过程一定要明确;给分根据解答时间和解答的有效性)

在一个网格状的棋盘里(像围棋一样的棋盘),可以放入白子和黑子,棋子只能放在交叉点上;每个棋子与相邻四个位置上的棋子连通。

现在棋盘上有一些白子,给出白子位置的集合,Swhite={(x1,y1),(x2,y2),...(xn,yn)},
现在要放入黑子,黑子可以放在与白子相同的位置,也可以放在空白点上,每个黑子放入后,拿掉黑子所在位置和相邻的四个点上放置的白子。

要求的问题:如何放置最小的黑棋数来拿掉所有的白棋,并且所有黑棋连通。
...全文
518 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mathe 2005-01-20
  • 打赏
  • 举报
回复
vertex cover问题是NPC的,但是不等于说对所有的图都是NP的,上面的结论是说,对于二分图,vertex covering是很好算的。我记得找极大匹配的算法的名称叫匈牙利算法的。
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
如果黑点必须放在白点的位置,基本上就是一个vertex cover问题,只不过每个点最多相邻4个点,而vertex cover 问题是一个NP难问题。
你说的匈牙利算法得到的是什么解?最优解还是近似解?
mathe 2005-01-20
  • 打赏
  • 举报
回复
如果只考虑覆盖问题,同Minimal Vertex covering 问题很接近(不完全相同,因为黑子可以不放在白子位置)。
http://www.maths.qmul.ac.uk/~crlg/Graphs/Chapter6.pdf
Konig's theorem. Let G be a bipartite graph. Then the number of edges in a matching of maximal size is the minimum size of a vertex covering.
matching of maximal size 可以用匈牙利算法算出的,所以这个问题可以容易解决。
现在是黑子可以不在白子位置,自己参考一下这个书上的内容吧:)我没有时间去考虑
wlpwind 2005-01-20
  • 打赏
  • 举报
回复
waiting for beautiful algorithm work.
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
------
所有白子组成一个点集, 代表要覆盖的区域 -------------对
所有白子和空白位置组成一个点集,代表黑子可放置的位置--- 对,
每个黑子占据一个5个点, 形成覆盖单位-------理解的应该是正确的,这种说法可能会产生歧义。实际上就是黑子只占据一个位置,但是辐射自己的位置和相邻的四个位置,这五个位置上的白子被拿走。

问题是用最小的覆盖单位,覆盖全部的要覆盖的区域.
------


开始的时候没有黑棋,最后肯定要形成一个黑棋的点集。
两个棋子连通就是指相邻,最后任意两个黑棋之间都有一条黑棋形成的路径。



寻开心 2005-01-18
  • 打赏
  • 举报
回复
这个是最小覆盖问题吧

所有白子组成一个点集, 代表要覆盖的区域
所有白子和空白位置组成一个点集,代表黑子可放置的位置
每个黑子占据一个5个点, 形成覆盖单位

问题是用最小的覆盖单位,覆盖全部的要覆盖的区域.

楼主的最后一个条件"并且所有黑棋连通"没有描述清楚
如果要连通,就必须同时也存在一个黑棋的点集了(这个点集初始状态是否就可能不连通呢)
连通定义为相邻是吗?
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
追加说明:
如果不能求出最优解,请说明所用黑棋数大概是最优解的多少倍,要有道理;
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
大概明白你的意思。
这种方法似乎没有针对这个问题的特殊性,解决问题的范围比较广。比如如果白子和黑子是在一个平面上的任何位置,而不是网格的交叉点上,这种方法可能比较适用。
---如果充分利用这个问题的特殊情况,比如棋子放在格点上,每个棋子最多与4个位置相邻等,是不是会有更好的解法?

寻开心 2005-01-18
  • 打赏
  • 举报
回复
最终的最优答案很可能是一棵树而不是一个图的结构
猜测

寻开心 2005-01-18
  • 打赏
  • 举报
回复
上面说的有点不清晰

先不考虑这个问题当中等一些特殊性, 覆盖的定义和连通的定义

我们考虑白子的连通区域是一个圆盘,半径是r

那么由同心的,半径是r-1, r-4, r-7, r-10 ... 这些圆以及圆以及一个公共的半径组成的并集就是一个覆盖了

这个就是解决第一个问题的思路

有了一个覆盖就是再从中间扣除一些多余点,还继续保持连通性就可以了
这样得到的答案虽然不一定是最优的,但是距离最优的差距也大不到哪里去
寻开心 2005-01-18
  • 打赏
  • 举报
回复
分两个部分吧
1) 先解决一个连通的白子区域内的黑子覆盖的问题
2) 解决独立的黑子覆盖区域之间的连通问题

对于第一个问题
1 对于一个白子连通区域, 把所有的白子替换成为黑子,显然可以解决覆盖问题
但是这个覆盖不是最优的覆盖, 它只是形成了一个初始覆盖
2 把初始覆盖的边界向内依次收缩1,3,5,7,...个单位,然后把这些收缩边界合并,并且加入若干个点保证连通, 那么这个结果可能依然是一个覆盖解
3 遍历这个覆盖,在保证连通的基础上删除一些重复点即可

对于第二个问题相对简单
找这些覆盖之间的最短路径就可以了
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
如果只考虑覆盖,有没有什么比较好的方法?
mathe 2005-01-18
  • 打赏
  • 举报
回复
考虑网络上节点之间的相互联通问题,上面的模型不好。
实际上,网络之间的距离(通讯的速度)不是同物理距离成线性关系的。
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
一些想法,不是答案,希望相互启发。

数据表示:
每个点用(x,y,棋子,相邻的白子数,相邻的黑子数)表示。

方法[1] 贪婪法:
每次找相邻白子数最多的点上放上黑子,然后修改周围点的数据,直到没有白子;放置一些黑子使得全部黑子连通。
主要问题
1)一些点相邻白子数相同时的如何放置
2)孤立白子将黑子放在那个位置。(有5个位置可选)
3)如果白子全部拿掉后,黑子正好连通,数目未必最优,但应该很接近,再加入什么方法可以最优?如果不能最优,差多少?
4)如果白子全部拿掉后,黑子不连通,可以寻找几个连通集合间最近的距离和路径来放置黑子。寻找几个连通集合间最近的距离和路径好像也不好做。


方法[2]
根据其他规则来选择要达到最优,必须放置黑子的位置。还没想出如何确定规则。

------------------------
如果可以解决在网格上两个各自连通而相互不连通的点集合间寻找距离最近的点问题(时间要复杂度小于(O(n^2))),先解决覆盖问题再想办法连通应该可以。
mathe 2005-01-18
  • 打赏
  • 举报
回复
hehe,上面的方法也不对,在内层由于已经有黑子了,处理方法同只有白子的外层不同
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
n 可能很大,数量级可能是百 千 万。



mathe 2005-01-18
  • 打赏
  • 举报
回复
发现关于角还完全可以再优化:)
mathe 2005-01-18
  • 打赏
  • 举报
回复
由外到里,分层解答,
对于每一层,先处理四个角(有两种方案),然后处理四条边。
比如刚开始,先查看4个角上有没有棋子,对于没有棋子的角,不予考虑,不然,(比如
位置(0,0)上有个白子,那么(1,0)或(0,1)位置必然有黑子的)
我们只比较两种方案:i) 在(1,0)(1,1)同时放上黑子
ii)在(0,1)(1,1)同时放上黑子
其他方案(比如(1,0)(2,0)同时放上黑子的,不会比上面的方案好)
而起这时我们可以查看坐标(2,0)和(0,2)的状态
如果(2,0)有棋,(0,2)没有棋,选择方案i)不会比方案ii)差。
如果(0,2)有棋,(2,0)没有棋,选择方案ii)不会比方案i)差。
如果都没有棋,两种方案等效
如果都有棋,两种方案都需要试探,我们让计算机同时搜索两种情况。
所以经过一层4个角的试探,我们最多要搜索16种情况。
然后对于每种方案,在搜索4条边可用方案时,我们先去除所有被黑棋覆盖或相邻的白子。
对于四条边上余下的白子,选择内侧相邻的格子放置黑子。
比如(3,0)上有白子,我们在(3,1)上放置黑子。
通过上面的一轮处理,我们可以完全不去考虑最外面一层了,然后我们转入第二层的分析。
同样,先去掉所有被黑棋覆盖或相邻的白子。然后看四个角,是否有棋子(白子或黑子)。
同样,对于每个角,最多有两种方案,由于有了黑棋,情况比上面只有白棋的复杂一些,但是
同样的,最多只需要分析两种情况的。
而后,同样在去除一些白棋后,分析4条边,对于边上每个余下的白棋或黑棋,在其内侧相邻位置放置一个黑棋。
我们通过这样的仿佛处理,到最后只剩下一个3*3或2*2的小棋盘还没有处理,没有仔细考虑,实在不行,因为剩下的穷举肯定可以了。
这种算法时间复杂度在最差的情况是O(4^n),n是棋盘的边长
在边长不太大时,完全没有问题。而起实际上,估计不会都遇上最差情况,要好的多。
你的问题的规模有多大了?
如果问题规模比较大,应该还可以优化,上面的处理过程种主要是角上处理比较复杂,应该可以进一步分析的。
programfanny 2005-01-18
  • 打赏
  • 举报
回复
up and waiting...
wlpwind 2005-01-18
  • 打赏
  • 举报
回复
黑棋连通示意图
下面*表示该位置上是黑棋,o表示没有棋子。


o * o * o *
o * o * * *
o * * * o o
这个是连通的.


o * o * *
o o * o *

这个不连通。

33,027

社区成员

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

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