如何循环矩阵使对角线上的数字具有很高的优先级

how to loop a matrix let the number on the diagonal has high priority?

本文关键字:数字 优先级 对角线 何循环 循环      更新时间:2023-10-16

我正在做一个项目,需要在二维数组(矩阵)中找到某个数字。矩阵顺序的访问顺序是这样的(4*4矩阵)。现在我站在0的位置。等价地,我想首先访问对角线上的矩阵元素。

0  2  7  14
3  1  5  12
8  6  4  10
15 13 11 9

此外,如何在不使用goto语句的情况下打破c++中的两个嵌套循环。

以下代码将遍历任何大小的方阵,优先权在对角线上

#define SIZE 4
static int test[SIZE][SIZE] =
{
    {   0,    2,    7,    14  },
    {   3,    1,    5,    12  },
    {   8,    6,    4,    10  },
    {  15,   13,   11,     9  }
};
int main( void )
{
   int diagonal, delta;
   for ( diagonal = 0; diagonal < SIZE; diagonal++ )
   {
       cout << test[diagonal][diagonal] << endl;
       for ( delta = 1; delta <= diagonal; delta++ )
       {
           cout << test[diagonal-delta][diagonal] << endl;
           cout << test[diagonal][diagonal-delta] << endl;
       }
   }
}

这里有一种方法可以在没有goto 的情况下突破嵌套循环

done = false;
for ( i = 0; i < 10; i++ )
{
    for ( j = 0; j < 10; j++ )
    {
        if ( some_condition_is_met )
        {
            done = true;
            break;
        }
    }
    if ( done )
        break;
}

使用另一个带有数组索引的数组(因为数组的大小可能是恒定的),例如,如果您将第一个数组存储在一维c++数组中,那么

int actual_arr[16];
int indices[16] = {0, 5, 1, 4, 10, 6, 9, 2, 8, 15, 11, 14, 7, 13, 3, 12 };

所以你可以写一个循环:

for (int i = 0; i  < 16; ++i)
{
  actual_arr[indices[i]]++;
}

因此,索引中的每个字段都是actual_arr的索引,此时将访问该索引。如果需要,也可以使用二维表示。只需将int indices[16]替换为std::pair<int, int> indices[16],就可以开始了。

特别是当您有一个固定大小的数组并多次访问它时,这是一个很好的解决方案,因为它不涉及循环中的任何计算。

Btw。顺便说一句,从数学上讲,索引数组被称为置换,可以是置换组中的一个运算。

要移动到右侧的元素,需要增加一行
要移动到左侧的元素,可以减少一行
若要移动到下面的元素,请增加一列
若要移动到上面的元素,请递减该列

现在要沿对角线移动,请观察行和列是如何变化的,并应用以上内容的组合。