2

私は次のことを可能にするアルゴリズムを見つけようとしています: 10 個のブール変数があり、すべての組み合わせを試したいと想像してください。メソッド true (このメソッドには多くの制限があるため、考えられるすべての組み合わせをテストしたいのですが、問題を解決する組み合わせがない場合は、ユーザーに通知したいと思います)。理解できることを願っています!

4

4 に答える 4

8

これを試して:

for (int i = 0; i < (1 << 10); i++)
{
    bool b1 = (i & (1 << 0)) != 0;
    bool b2 = (i & (1 << 1)) != 0;
    bool b3 = (i & (1 << 2)) != 0;
    bool b4 = (i & (1 << 3)) != 0;
    ...

    if (MyMethod(b1, b2, b3, b4, ...))
    {
        // Found a combination for which MyMethod returns true
    }
}

もちろん、LINQ も使用できます。

var result = from b1 in new[] { false, true }
             from b2 in new[] { false, true }
             from b3 in new[] { false, true }
             from b4 in new[] { false, true }
             ...
             where MyMethod(b1, b2, b3, b4, ...)
             select new { b1, b2, b3, b4, ... };
于 2012-09-19T05:08:11.863 に答える
1

私はついに、より効率的な方法を思いつきました: 2 進数を使用する: 8 つの変数から可能なすべてのブール値の組み合わせをテストしたいとしましょう: 次のことを選択すると、すべての組み合わせをテストすることができます:

public string CombinationFinder()
{
    for (int i = 0; i < 2 ^ 8; i++)
    {
        String ans = Convert.ToInt32(i, 2).ToString();
        if (myMethod(ans))
        {
            return ans;
        }
    }
    return null;
}

これは 0 から 255 までの範囲で、2 進数では 00000000 から 11111111 までの範囲を意味し、各桁は 0 または 1 の値を取り、ブール値として表すことができます。この例では、組み合わせが見つからない場合、メソッドは null を返します。

于 2012-10-26T14:42:11.347 に答える
0

次のようなクラスを定義します。

class Bint
{
  int num;
  public bool this[int num]
  {
    get {return num << n & 0x1 == 1;}
  }
  public int Num
  {
    get {return num;}
    set {num = value;}
  }
}

数字を繰り返します:

Bint n = new Bint();
for (int i = 0; i < Math.pow(2,10); i++)
{
 n.Num = i;
 f(n[0],n[1]...);
}
于 2012-09-19T05:13:07.583 に答える