哈希游戏中岛屿的每个可能的组合

时间:2017-06-03 15:01:25

标签: 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]
];

感谢。

1 个答案:

答案 0 :(得分:2)

如果要查找每个邻居的链接(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上看到它。