对不起上次提问的问题现在还不清楚现在改写它
有使用2D矩阵表示的板,如下所示
[
{0 0 1 0 1 1 0 1 0 0 1 1},
{0 1 1 0 1 0 0 1 1 0 0 1},
{0 0 0 0 0 0 0 1 0 0 0 0}
]
相邻意味着找到另一个共享相同索引或触摸另一个三角形的三角形 意味着必须有水平或垂直的,如下面的类型2所示
如果在用1表示的矩阵中连接3个点,则会产生一个直角三角形,有四种类型的直角三角形
即
Type1 : a[0][2],a[1][1],a[1][2]
Type2 : a[0][4],a[0][5],a[1][4] and a[1][7],a[1][8],a[2][7]
Type3 : a[0][7],a[1][7],a[1][8]
Type4 : a[0][10],a[0][11],a[1][11]
当连接所有三个顶点时,给出四个类型中的任何一个的直角三角形 在上面的例子中,有两个直角三角形彼此相邻(意味着两个连续的水平或垂直),即
a(0)(7), a(1)(7),a(1)(8)and a[1][7],a[1][8],a(2)(7)
需要有效的方法来遍历矩阵以找到板上每个三角形图案的计数,其使用N * N矩阵表示 有一些条件 1:如果任何三角形与任何类型的两个三角形相邻,则不会计算 2:任何三角形共享公共单元的一个三角形类型使用一个单元格,然后不计算
我对图表知之甚少,但我尝试使用这种逻辑 1:为每个三角形类型定义矩阵2 * 2 2:确定2 * 2矩阵的粒度板,表示2 * 2板的十个矩阵 3对每个2 * 2块使用每种类型的memcmp意味着每个块上有4个内存比较功能
但是这不起作用,因为三角形永远不能对齐阻止它可以从奇数指数开始 做了一些研究之后,这可以使用图表来实现,但仍然不知道如何在图表上搜索模式 请提供一些输入和一些学习练习,以便更详细地了解这些问题
答案 0 :(得分:1)
此回复可能无法回答您的整个问题,但至少会有一些代码需要讨论。我认为很难对块进行memcmp,因为三角形的2x2块在两个不同位置的内存中被放置为2 + 2个数据块。 Memcmp假设您的所有数据都在连续的内存中。
下面的代码有find_triangles函数,我们可以继续讨论和改进。它将每个三角形定义为单个点,即两条线的交点。要成为一个三角形,交点必须为1.一旦我们很容易找到可能的交点,下一个问题是该点是否真的是任何三角形和三角形的真实交点。我将类型存储为结果中的位域。
主要功能可能不那么容易阅读,但它只是简短并将结果打印为概念证明。
#include <stdio.h>
#define TYPE1 0x01
#define TYPE2 0x02
#define TYPE3 0x04
#define TYPE4 0x08
void find_triangles(int h, int w, int data[h][w], int res[h][w])
{
int x, y;
for(y=0; y<h; y++)
for(x=0; x<w; x++)
if(data[y][x])
res[y][x] =
TYPE1*(y && data[y-1][x]) * (x && data[y][x-1])|
TYPE2*((y<(h-1)) && data[y+1][x]) * ((x<(w-1)) && data[y][x+1])|
TYPE3*(y && data[y-1][x]) * ((x<(w-1)) && data[y][x+1])|
TYPE4*((y<(h-1)) && data[y+1][x]) * (x && data[y][x-1]);
else
res[y][x] = 0;
}
int main(int argc, char **argv)
{
#define DATA_WIDTH 12
#define DATA_HEIGHT 3
int data[DATA_HEIGHT][DATA_WIDTH]={
{0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1},
{0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0}};
int result[DATA_HEIGHT][DATA_WIDTH];
int x, y, type;
find_triangles(DATA_HEIGHT, DATA_WIDTH, data, result);
for(type=0; type<4; type++)
{
printf("Type%d : ", type+1);
for(y=0; y<DATA_HEIGHT; y++)
for(x=0; x<DATA_WIDTH; x++)
if(result[y][x] & (1<<type))
printf("a[%d][%d],a[%d][%d],a[%d][%d] ",
y,x,
(type & 0x1) ? y+1 : y-1, x,
y, ((type >> 1)==(type & 0x1)) ? x-1 : x+1);
printf("\n");
}
return 0;
} /* main */
我不认为我完全理解不应该计算哪些相邻的三角形,但我希望这个代码示例能够开始。