我想将元素放在n * n矩阵中。限制是每个对角线上最多允许m个元素。我想不出表达这种限制的一般方法。有人可以帮忙吗?
感谢。
答案 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.
}
}