这是为您的问题建模的另一种(离散优化)方法。
符号
将您的网格视为具有 n^2 个节点和长度为 1 的边(边连接两个相邻节点)的“图”。让节点编号为 1:n^2。(为了便于表示,如果您愿意,可以使用双数组 (x,y) 来表示每个节点。)
决策变量
有 k 种颜色,每个玩家一种(1 到 4)。0 是无人认领的单元格(白色)
X_ik = 1 if player k has claimed node i. 0 otherwise.
开始
X_i0 = 1 for all nodes i.
所有节点都以白色 (0) 开始。
相邻集:如果两个节点 i 和 j 彼此相邻,则它们是“邻居”。(任何给定的节点我最多可以有 4 个邻居:上下左右。)
边变量:
我们现在可以定义一组新的边变量Y_ijk
,这些变量将两个相邻节点(i 和 j)与一个共同的颜色 k 连接起来。
Y_ijk = 1 if neighboring nodes i and j are both of color k. 0 Otherwise.
(That is, X_ik = X_jk) for non-zero k.
我们现在有一个无向图。检查“闭合模式”与检测周期相同。
检测周期:
一个简单的 DFS搜索就可以了,因为我们有无向循环。从每个彩色节点 i 开始,并检查循环。如果路径将您带回访问的节点,则存在循环。您可以相应地奖励积分。
最后,在您设计游戏时提出一个建议。您可以根据您检测到的“最长周期”奖励积分。最短的循环得到 4 分,每条边得到 1 分(或循环中的每个节点得到 1 分),以最适合您的为准。
1 1
1 1 scores 4 points
1 1 1
1 1 1 scores 6 points
1 1 1
1 1 1
1 1 scores 8 points
希望有帮助。