php - 哈希游戏中一个岛屿的所有可能组合

标签 php algorithm

这是游戏:Hashiwokakero .

为了解决这个问题,我需要找到所有可能的链接 + 每个岛屿周围岛屿的组合。

约束是 1 或 2 个链接,一个组合足以为目标岛屿创建链接。

例如,我有一个岛['A' => 3],这意味着它需要解决3个链接,并且它有3个邻居['B', ' C', 'D'].

我想找到一个可以产生这样一个数组的算法:

[
    ['B' => 1, 'C' => 1, 'D' => 1],
    ['B' => 1, 'C' => 2],
    ['B' => 1, 'D' => 2],
    ['B' => 2, 'C' => 1],
    ['B' => 2, 'D' => 1],
    ['C' => 1, 'D' => 2],
    ['C' => 2, 'D' => 1]
];

谢谢。

最佳答案

如果您想找到每个邻居的所有链接组合(0、1 或 2),链接总数是固定的,那么您可以使用以下递归函数:

function getPossibleLinks($value, $neighbors) { 
    if ($value == 0) return [[]];
    $max = min(2, $value);
    $min = 2 - min(count($neighbors) * 2 - $value, 2);
    if ($min > 2) {
        throw new Exception('Not possible to assign that many links');
    }
    $results = [];
    for ($count = $min; $count <= $max; $count++) {
        $nextResults = getPossibleLinks($value - $count, array_slice($neighbors, 0, -1));
        foreach($nextResults as $result) {
            if ($count) $result[end($neighbors)] = $count;
            $results[] = $result; 
        }
    }
    return $results;
}

您需要将链接数作为第一个参数 ($value) 传递给它,并将邻居数组作为字符串数组传递给它。

调用示例:

$results = getPossibleLinks(3, ["B", "C", "D"]);

此调用后,$results 将具有以下内容:

[
    ['B' => 2, 'C' => 1],
    ['B' => 1, 'C' => 2],
    ['B' => 2, 'D' => 1],
    ['B' => 1, 'C' => 1, 'D' => 1],
    ['C' => 2, 'D' => 1],
    ['B' => 1, 'D' => 2],
    ['C' => 1, 'D' => 2]
]

查看它在 eval.in 上运行.

关于php - 哈希游戏中一个岛屿的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44345280/

相关文章:

algorithm - 算法在最坏情况下的运行时间

php - 使用php在sql数据库中插入多行

php - 无法创建外键约束

python - 如何从调色板中进行颜色渐变

c# - 将深度数组转换为树的高效算法

c++ - 模幂(模算术中的幂)

algorithm - 生成 N 个数字,使得每个数字之间的汉明距离至少为 D

php - 如何在有在线交易时向离线应用程序发送通知

php - Yii2在beforeSave()和update(或insert)中检查模型三个字段的存在组合

php - 从 PHP 和 Timber/Twig 中的高级自定义字段对转发器字段进行排序