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

3

我正在处理一个项目,需要在一个二维数组(矩阵)中查找一个特定的数字。访问矩阵元素的顺序如下(4 * 4矩阵)。现在我站在位置0上。等价地说,我想首先按对角线访问矩阵元素。

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

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

你的理解是要使用两个for循环来遍历。 - smali
到目前为止,我必须逐行访问矩阵元素。该矩阵规模较小,但访问操作将执行多次。 - Jun Wang
3个回答

3

使用另一个带有数组索引的数组(因为你的数组大小可能是固定的),例如,如果你将第一个数组存储在一维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]]++;
}

所以,indices 中的每个字段都是 actual_arr 的一个索引,这些索引将在此处被访问。如果需要,您也可以使用二维表示法。只需将 int indices[16] 替换为 std::pair<int, int> indices[16] 即可。特别是当您有一个固定大小的数组并多次访问它时,这是一个好的解决方案,因为它不涉及循环中的任何计算。顺便说一下,从数学上讲,indices 数组将被称为排列,并且可以是置换群中的一个操作。置换群

3
以下代码将遍历任何大小的方阵,并优先考虑对角线。
#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;
}

1
要移动到右侧的元素,增加行数。
要移动到左侧的元素,减少行数。
要移动到下方的元素,增加列数。
要移动到上方的元素,减少列数。

现在来斜向移动,观察行和列如何变化,并应用上述方法的组合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接