【问题标题】:Array Constraint Satisfaction数组约束满足
【发布时间】:2014-11-18 00:18:03
【问题描述】:

给定数字 1 到 N 的范围,其中 N >=3。你必须采取 长度为 2N 的数组并放置每个数字(从 1 到 N) 两次。这样一个数字的两个索引之间的距离是 等于数。例子

N=3

(3, 1, 2, 1, 3, 2)

我想到的解决方案如下:

  1. 生成数字范围的每个排列数组,例如:{1,2,3|、{3,2,1}、{2,1,3} 等。

    李>
  2. 对于每个排列数组,运行以下函数:

    foreach(int number : permutationArray){
        addToResultArray(number);
    }
    
    addToResultArray(int toBeAdded){
        for(int i = 0; i < resultArray.length; i++){
            //-1 implies the resultArray is empty at that index
            if(resultArray[i]==-1 && resultArray[i+toBeAdded+1]==-1)
                resultArray[i] = toBeAdded;
        }
    }
    
  3. 如果上述函数没有导致越界异常,那么您有一个有效的解决方案。

我认为这个解决方案不是很好。有人有更好的吗?

【问题讨论】:

标签: java arrays algorithm constraints


【解决方案1】:

这可以看作是一个约束问题:你有2*N变量V={v1,v2,...,v2n}(代表数组索引)每个变量在约束下都有[1,2,..,N]可能的值:

  1. 每个值都分配给两个变量。
  2. 具有相同值的变量之间的距离等于值本身。

赋值是从一组变量到它们的可能值的映射。例如[v1=1,v2=3,v3=5]v1,v2v3 的赋值。如果给定的分配满足约束条件,则它是一致的。分配不一致的一个例子是[v1=3,v2=1,v3=3]

如果其基数等于变量大小(即2*N),则赋值完成。否则,它是部分分配。显然,我们的目标是完成一个或多个完整一致的分配(a.k.a 解决方案)。

所以这个问题基本上是一个回溯搜索问题。特别是,我们对变量进行了排序。每次我们为当前变量赋值。如果该值使当前分配不一致,我们回溯

您的方法实际上是一个效率低下的generate-and-test。生成所有解决方案并计算它们通常是一个难题。在大多数情况下,我们都在寻找一种解决方案。

这是有趣的部分:有一种更有效的方法可以通过传播值和更快地检测回溯(参见constraint propagation)。

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2018-04-11
    相关资源
    最近更新 更多