登录
首页 >  Golang >  Go问答

在 Go 语言中寻找匹配的排列

来源:stackoverflow

时间:2024-02-28 22:12:25 148浏览 收藏

哈喽!今天心血来潮给大家带来了《在 Go 语言中寻找匹配的排列》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

在这里,我试图形成一个包含数字对的排列,每对mm元素分隔。例如:

  • 对于 [0,2],配对排列为 [2,0, 0,2],使得 m=2,因此数字 2 由 2 个元素分隔。
  • 对于 [0,1] = 没有有效的排列

我仍然无法弄清楚排列的模式或算法,因为我需要找到最多 [0,1,2,3,4,5,6,7,8] 的排列。然而,通过手动执行此列表的有效排列是 [3,7,8,2,3,1,2,1,6,7,5,8,4,0,0,6,5,4] 。

在下面的代码中,我只能通过首先获取列表中最大的数字来重新排列列表中的数字。我想知道如何根据对的数量来分离这对(例如,如果对是2,则分离数是2)

如何对数字列表进行分隔和模式?

package main

    import "fmt"

    func MagicPairs(list []int) {
        //length := len(list) * 2
        magicPair := []int{}
        magicPair = append(list, list...)

        for i := 0; i  max {
                max = value 
            }
        }
        return max
    }

    func main(){
        list := [] int {0,1,2,3,4,5,6,7,8}
        MagicPairs(list)

    }

解决方案


您似乎试图通过将源列表加倍,然后通过重复切片和连接数组来打乱数字来找到最佳解决方案。

我认为这个问题适合采用递归方法。使用 2 * len(list) 空槽创建目标数组。 (槽是否为空必须用特殊值标记,例如-1。)然后递归地尝试将原始数组的元素放入目标数组中。

让我们看看您的示例 {0, 1, 3}。创建目标数组:

. . . . . .

尝试 0 的所有可能位置。第一个是

0 0 . . . .

现在尝试拟合1。有两种可能性

0 0 . . . .
0 0 1 . 1 .

但是这不能容纳下一个元素,3.返回一步:

0 0 . . . .
0 0 . 1 . 1

这 3 个也不适合放在这里。我们已经用尽了对零位置的搜索,所以让我们采取下一个可行的零位置:

. 0 0 . . .

只有一种放置方法:

. 0 0 . . .
. 0 0 1 . 1

现在让我们尝试调整 3,宾果!它适合:

. 0 0 . . .
. 0 0 1 . 1
3 0 0 1 3 1

现在您可以停止搜索或尝试寻找其他解决方案。在这种情况下,只有另一种解决方案,即该解决方案的反射,但有 300 种方法可以放置从 1 到 8 的数字,例如。

这种方法几乎是蛮力的,但在实践中,没有很多有效的方法来填充数组,因此可以及早检测到错误的路径。也许将大数字放在第一位可以提供更好的性能。您可以使用它并测量它。

这是一个执行此操作的程序。 (它可能看起来更像 c 而不是 go。没关系。)

package main

import "fmt"

func fit_r(res[] int, a[] int, i int) int {
    n := len(a);

    if i == n {
        fmt.Printf("%v\n", res);
        return 1;
    } else {
        count := 0;
        m := a[i];

        for j := 0; j < 2*n - 1 - m; j++ {
            if res[j] == -1 && res[j + 1 + m] == -1 {
                // place values
                res[j] = m;
                res[j + 1 + m] = m;

                // test further values
                count += fit_r(res, a, i + 1);

                // clean up and remove values again
                res[j] = -1;
                res[j + 1 + m] = -1;
            }
        }        

        return count;
    }
}

func fit(a[] int) int {
    res := make([] int, 2 * len(a));

    for i := range res {
        res[i] = -1;
    }

    return fit_r(res, a, 0);
}

func main() {
    list := [] int {0, 1, 2, 3};
    n := fit(list);

    fmt.Println(n, "solutions");
}

本篇关于《在 Go 语言中寻找匹配的排列》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>