如何获得六边形的对角线?

时间:2015-11-26 22:03:22

标签: prolog geometry

形状是这样的:

  A,B,C
 D,E,F,G
H,I,J,K,L
 M,N,O,P
  Q,R,S

我希望将对角线约束为某个总和,即:

  

A + D + H = B + E + I + M = ...... = L + P + S = CONST_SUM

我想通过计算每个级别的跳数来展平列表并试图找出一些数学公式以获得正确的元素。到目前为止,我只有这个:

matrix([[1,2,3],[4,5,6,7][8,9,10,11,12],[13,14,15,16],[17,18,19]).

check(M) :-
    matrix(M),
    flatten(M, L),
    check_sum(L, 1).

然而,数学方法在论文中似乎并不顺利。任何想法?

修改

我无法计算出数学规则(每个对角线的跳跃),也许我应该遵循另一种方法,而不是扁平的...

1 个答案:

答案 0 :(得分:2)

你可以做的一件事就是把六角形写成这样:

#include <stdlib.h>
#include <stdint.h>

typedef struct { int32_t x, y; } INTPAIR;
typedef struct { int32_t w; INTPAIR xy; } INTANDPAIR;

void foo(INTPAIR * s1, INTPAIR * s2)
{
  s2->y++;
  s1->x^=1;
  s2->y--;
  s1->x^=1;
}

int hey(int x)
{
  static INTPAIR dummy;
  void *p = calloc(sizeof (INTANDPAIR),1);
  INTANDPAIR *p1 = p;
  INTPAIR *p2a = p;
  INTPAIR *p2b = &p1->xy;
  p2b->x = x;
  foo(p2b,p2a);
  int result= p2b->x;
  free(p);
  return result;
}

#include <stdio.h>

int main(void)
{
    for (int i=0; i<10; i++)
      printf("%d.",hey(i));
}

然后一种对角线将具有固定的 x 条目(“列”),另一种固定的 y 条目(“行”),以及第三种固定的 x - y 差异(“降序对角线”)。如果你展平它,你必须以某种方式表示形状周围的空单元格,并在迭代时dkip它们或者首先从迭代中排除它们。您需要额外的内存要求来支付更简单的公式。