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

Posted

技术标签:

【中文标题】如何循环矩阵让对角线上的数字具有高优先级?【英文标题】:how to loop a matrix let the number on the diagonal has high priority? 【发布时间】:2014-10-17 06:16:46 【问题描述】:

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

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

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

【问题讨论】:

你的理解说要做什么..意思是想用2个for循环遍历 直到现在,我必须逐行访问矩阵元素。矩阵体积小,但访问操作会执行多次。 【参考方案1】:

以下代码将遍历任意大小的方阵,对角线优先

#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;

【讨论】:

【参考方案2】:

使用另一个带有数组索引的数组(因为你的数组的大小可能是恒定的),例如,如果你将第一个数组存储在一维 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&lt;int, int&gt; indices[16] 即可。

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

顺便说一句。作为旁注,从数学上讲,索引数组将被称为排列,并且可以是permutations group 中的操作。

【讨论】:

【参考方案3】:

要移动到右侧的元素,请增加一行。 要移动到左侧的元素,请递减一行。 要移动到下面的元素,请增加一列。 要移动到上面的元素,请减少列。 现在要沿对角线移动,观察行和列如何变化并应用上述组合。

【讨论】:

以上是关于如何循环矩阵让对角线上的数字具有高优先级?的主要内容,如果未能解决你的问题,请参考以下文章

深度优先算法和广度优先算法

图的存储结构:必须掌握的深度优先算法和广度优先算法

计算矩阵对角线上的数字总和

求一个3*3的整形矩阵对角线元素之和

Java--算法特训暴力破解和实用性优先(题目三)

python-leetcode329-深度优先搜索矩阵中的最长递增路径