限制矩阵中放置的一般算法

时间:2011-03-10 09:47:39

标签: algorithm matrix

我想将元素放在n * n矩阵中。限制是每个对角线上最多允许m个元素。我想不出表达这种限制的一般方法。有人可以帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:3)

对角线(m = n-1):

0 1 2 . . . m
1 2 . . . m .
2 . . . m . .
. . . m . . .
. . m . . . .
. m . . . . .
m . . . . . 2m

这些可以用数组diag1 [2 *(n-1)]表示。

这是另一个方向:

m . . . . . 2m
. m . . . . .
. . m . . . .
. . . m . . .
2 . . . m . .
1 2 . . . m .
0 1 2 . . . m

这些可以用类似的数组diag2 [2 *(n-1)]表示。

示例5x5矩阵:

diag1 [2 *(n-1)]表示以下对角线......

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

diag2 [2 *(n-1)]代表以下对角线......

4 5 6 7 8
3 4 5 6 7
2 3 4 5 6
1 2 3 4 5
0 1 2 3 4

这两个数组和以下函数都应该添加到矩阵类中,假设你有一个。

addElement(element_ *elementptr, int x, int y)
{
   if (diag1[x+y] < maxDiag1 && diag2[x+(n-1)-y] <maxDiag2) {
      diag1[x+y]++; 
      diag2[x+(n-1)-y]++;
      matrix[x][y] = elementptr;
   } else {
      // show error message?  return 0?  etc.
   }
}

remElement(int x, int y)
{
   if (matrix[x][y] != NULL) {
      diag1[x+y]--;
      diag2[x+(n-1)-y]--;
      matrix[x][y] = NULL;
   } else {
      // show error message?  return 0?  etc.
   }
}