Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I think the following C# program should work. It uses the <a href="http://en.wikipedia.org/wiki/Branch_and_bound" rel="nofollow noreferrer">branch and bound method</a> and works for arrays of any number of dimensions.</p> <pre><code> using System; using System.Collections.Generic; namespace SO_strides { sealed class Dimension { public int Min { get; private set; } public int Max { get; private set; } public int Stride { get; private set; } private Dimension() { } public Dimension(int max, int stride) { Min = 0; Max = max; Stride = stride; } public Dimension[] Halve() { if (Max == Min) throw new InvalidOperationException(); int split = Min + (Max - Min) / 2; return new Dimension[] { new Dimension { Min = Min, Max = split, Stride = Stride }, new Dimension { Min = split + 1, Max = Max, Stride = Stride } }; } } sealed class ArrayPart { public int BaseAddr { get; private set; } public Dimension[] Dimensions { get; private set; } public int FirstNonconstantIndex { get; private set; } int? min; public int Min { get { if (min == null) { int result = BaseAddr; foreach (Dimension dimension in Dimensions) result += dimension.Min * dimension.Stride; min = result; } return min.Value; } } int? max; public int Max { get { if (max == null) { int result = BaseAddr; foreach (Dimension dimension in Dimensions) result += dimension.Max * dimension.Stride; max = result; } return max.Value; } } public int Size { get { return Max - Min + 1; } } public ArrayPart(int baseAddr, Dimension[] dimensions) : this(baseAddr, dimensions, 0) { Array.Sort(dimensions, (d1, d2) =&gt; d2.Stride - d1.Stride); } private ArrayPart(int baseAddr, Dimension[] dimensions, int fni) { BaseAddr = baseAddr; Dimensions = dimensions; FirstNonconstantIndex = fni; } public bool CanHalve() { while (FirstNonconstantIndex &lt; Dimensions.Length &amp;&amp; Dimensions[FirstNonconstantIndex].Min == Dimensions[FirstNonconstantIndex].Max) FirstNonconstantIndex++; return FirstNonconstantIndex &lt; Dimensions.Length; } public ArrayPart[] Halve() { Dimension[][] result = new Dimension[2][]; Dimension[] halves = Dimensions[FirstNonconstantIndex].Halve(); for (int i = 0; i &lt; 2; i++) { result[i] = (Dimension[])Dimensions.Clone(); result[i][FirstNonconstantIndex] = halves[i]; } return new ArrayPart[] { new ArrayPart(BaseAddr, result[0], FirstNonconstantIndex), new ArrayPart(BaseAddr, result[1], FirstNonconstantIndex) }; } } sealed class CandidateSet { public ArrayPart First { get; private set; } public ArrayPart Second { get; private set; } public CandidateSet(ArrayPart first, ArrayPart second) { First = first; Second = second; } public bool Empty { get { return First.Min &gt; Second.Max || Second.Min &gt; First.Max; } } public CandidateSet[] Halve() { int firstSize = First.Size; int secondSize = Second.Size; CandidateSet[] result; if (firstSize &gt; secondSize &amp;&amp; First.CanHalve()) { ArrayPart[] halves = First.Halve(); result = new CandidateSet[] { new CandidateSet(halves[0], Second), new CandidateSet(halves[1], Second) }; } else if (Second.CanHalve()) { ArrayPart[] halves = Second.Halve(); result = new CandidateSet[] { new CandidateSet(First, halves[0]), new CandidateSet(First, halves[1]) }; } else throw new InvalidOperationException(); return result; } public static bool HasSolution(ArrayPart first, ArrayPart second) { Stack&lt;CandidateSet&gt; stack = new Stack&lt;CandidateSet&gt;(); stack.Push(new CandidateSet(first, second)); bool found = false; while (!found &amp;&amp; stack.Count &gt; 0) { CandidateSet candidate = stack.Pop(); if (candidate.First.Size == 1 &amp;&amp; candidate.Second.Size == 1) found = true; else { foreach (CandidateSet half in candidate.Halve()) if (!half.Empty) stack.Push(half); } } return found; } } static class Program { static void Main() { Console.WriteLine( CandidateSet.HasSolution( new ArrayPart(2, new Dimension[] { new Dimension(1, 1), new Dimension(2, 4) }), new ArrayPart(4, new Dimension[] { new Dimension(1, 1), new Dimension(2, 4) }) ) ); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload