C编程语言三角形邻接

时间:2016-01-24 13:35:41

标签: c algorithm graph-algorithm

对不起上次提问的问题现在还不清楚现在改写它

有使用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}
]
  1. 每当看到00时,它表示0 0表示矩阵
  2. 中有一些空格
  3. 相邻意味着找到另一个共享相同索引或触摸另一个三角形的三角形 意味着必须有水平或垂直的,如下面的类型2所示

    如果在用1表示的矩阵中连接3个点,则会产生一个直角三角形,有四种类型的直角三角形

    以上矩阵中的类型示例

  4. 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个内存比较功能

    但是这不起作用,因为三角形永远不能对齐阻止它可以从奇数指数开始 做了一些研究之后,这可以使用图表来实现,但仍然不知道如何在图表上搜索模式 请提供一些输入和一些学习练习,以便更详细地了解这些问题

1 个答案:

答案 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 */

我不认为我完全理解不应该计算哪些相邻的三角形,但我希望这个代码示例能够开始。