我正在尝试找到一种允许我执行以下操作的算法:假设我有 10 个布尔变量,并且我想尝试每个组合,因为我的目标是找到任何组合作为结果给我的一个methods true (这种方法有很多限制,这就是为什么我要测试所有可能的组合,如果没有可以解决问题的组合,那么我想通知用户)。我希望这是可以理解的!
问问题
4829 次
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
我终于想出了一个更有效的方法:使用二进制数:假设我想测试 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,二进制表示从 00000000 变为 11111111,其中每个数字取值 0 或 1,可以表示为布尔值。在此示例中,如果未找到组合,则该方法将返回 null。
于 2012-10-26T14:42:11.347 回答
1
我知道这是一个老问题,但 waclock 的答案无法编译(C# 中没有指数运算符)。dtb 的答案达到了 99%,但不处理未知数量的布尔值,这就是这个答案提供的:
var props = typeof(TypeWithBooleans).GetProperties().Where(prop => prop.PropertyType == typeof(bool)).ToArray();
for (var i = 0; i < (1 << props.Length); ++i)
{
var combination = Enumerable.Range(0, props.Length).Select(j => (i & (1 << j)) != 0).ToArray();
if (MyMethod(combination)) {
// handle match
};
}
这假设您关心的所有布尔值都局限于单个类/结构,并且MyMethod
使用 params 数组。
于 2017-04-29T03:52:31.520 回答
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 回答