c# - 如何查找布尔 3x3 网格算法的所有配置
问题描述
我需要计算 3x3 布尔网格的所有独特配置。
- 我有一个 3 x 3 的网格。
- 中心是参考点。
- 围绕中心的每个图块可以是
true
, 或false
。 - 如果 1 个或多个图块处于真实状态,则它是一个配置。
- 由于我需要一种方法来计算
true
每个配置的条目数,因此每个网格单元都分配了一个数字。 - 我开发了一系列数字,它们可以组合成 8 个或更少的无限配置,而不会产生重复:
(1,5,9,11,290,31,73,990)
- 当配置中的所有数字相加时,它们总和为一个唯一的数字,可用于识别该配置。因此,这是一个非常有用的布尔网格系统。
该网格的真值表如下:
1, 5, 9,
11, 0, 290,
31, 73, 990
如果中心瓷砖有 1 个连接,它有 8 种可能性:
[1,5,9,11,290,31,73,990]
如果中心瓷砖有 2 个连接,它有以下可能性:
[6, 10, 12, 291, 32, 74, 991, 14, 16, 295, 36, 78, 995, 20, 299, 40,
82, 999, 301, 42, 84, 1001, 321, 363, 1280, 104, 1021, 1063
我已将前两个配置组分成几行。(第一个被省略,因为它是一次只有一个单元格为真的配置)
void Row2()
{
list = new List<string>();
int [] t = new int [] {1,5,9,11,290,31,73,990};
string s = "[";
int start = 0;
for (int i = start; i < t.Length; i++
{
for(int j = i + 1; j < t.Length; j++)
{
int o = t[i]+ t[j];
if(i == 0 && j == 1)
{
s += o.ToString();
}
else
{
s += ", " + o;
}
}
start++;
}
s = s + "]";
list.Add(s);
}
解决方案
这是另一种方法。
用 0 和 1 表示 3*3 网格。如果中心与元素 1 有连接,如果不是 0。
1 0 0 0 0 1 1 1 1
上面的配置意味着中心有5个连接,左上、右、左下、下、右下。
此配置可以表示为 8 位 int。最小的是 0000 0000 - 没有连接,最大的是 1111 1111 - 所有连接。这两个数字之间的所有数字代表一个独特的组合。
如果您需要具有 3 个连接的配置,请运行从 0(最小)到 2^9 - 1(最大)的循环,并检查该数字是否具有 3 个设置位 [3 个 1 在其二进制表示中]。如果存储号码。最后将数字转换为 3*3 配置。
可以通过两种方式计算 1 的数量。
4.1 由于位数固定为 8,采用 8 位掩码,其工作是仅提取特定位并将它们相加
bit1_mask = 0000 0001
bit2_mask = 0000 0010
....
bit8_mask = 1000 0000
bits = (n&bit1_mask) + (n&bit2_mask) +.....(n&bit8_mask)
4.2 使用2的补码作为掩码得到最后一个设置位
c=0;
while(n>0){
n&=-n;
++c;
}
c 将具有位数。
推荐阅读
- dialogflow-es - Dialogflow CX Page Fulfillment Response Text Parameter Is List(ES用户可能也知道答案)
- javascript - ipcRenderer 代替远程
- sed - sed 错误无效使用行地址 0
- r - 将函数的输出多次传递回输入
- javascript - 获取用户的地理位置,应用程序显示 lat 和 lng 但无法获取用户城市名称的反向地理编码
- ios - 如何在应用启动时调试与主机的随机 DYGLInitPlatform 连接失败错误?
- linux - 如何在 Linux 的同一进程中加载两个版本的库?
- mongodb - 尝试写入 Mongo 副本集时导致超时的原因是什么?
- macos - Mac 上的 Visual Studio 使用什么来在本地托管 Web 应用程序?
- java - 如何使用 SpringBoot 获取不带等号的查询字符串?