游戏中的算法,有点难度的

wuwify 2012-09-05 10:02:28
好吧,我承认我是想偷个懒
想写个程序把游戏玩通关了
但我也没想明白,来这里求教了~~


题目:
在一张 N * M 的网格图中,给定一些点。
两个点为一组,其颜色相同
用线条将相同颜色的点连接起来
要求线条不能交叉

请给出所有线条连接最短的算法

如下图
...全文
202 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang_xiaohan 2012-09-07
  • 打赏
  • 举报
回复
游戏高玩啊,gaowan
wuwify 2012-09-07
  • 打赏
  • 举报
回复
感谢,差不多想通了
  • 打赏
  • 举报
回复
膜拜1楼。
FancyMouse 2012-09-06
  • 打赏
  • 举报
回复
最小费用最大流就能满足要求。不过如果需要线路不交叉的话那需要改一下图。
新图是两层N*M的图,总共2*N*M个点,这里我用(i,j,k)来表示一个点,0<=i<n,0<=j<m,k=0,1。对于原图里任何一组相邻边(x,y)-(z,w)(即|x-y|+|z-w|=1的所有(x,y,z,w)),在新图里建立一条边(x,y,1)->(z,w,0)以及(z,w,1)->(x,y,0)。此外对于所有点(x,y),在新图里建立一条边(x,y,0)->(x,y,1)。所有边的容量费用都是1。

最后建立一个源点s汇点t,如果有一组(x,y),(z,w)需要连接,那从s连到(x,y,0),再从(z,w,1)连到t,容量1费用0。然后直接跑最小费用最大流就能出解了。如果跑出来的最大流不是点的对数的话不存在连接所有点对的解。

以上模型是基于线路和线路之间不能有任何交点,哪怕交点只有1个也不行。如果题目要求是不能共享边但是可以共享点的话那就不用拆图了,直接原来的N*M的图上建立源点汇点就行。

33,008

社区成员

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

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