【问题标题】:How to iterate through 2d array starting from some position?如何从某个位置开始遍历二维数组?
【发布时间】:2018-01-06 17:14:46
【问题描述】:

我必须在整个矩阵中的随机位置 X 移动棋子:

在每个新位置,我都会将其与该位置的值进行比较(为简单起见,矩阵中唯一的部分是 X)。如果 X 从 0 开始,这样做会很容易,但在我的情况下,X 片段可以从矩阵中的任何位置开始,现在我首先从这个循环开始:

for(int i = row_x;i<rows;i++)
    for(int j = col_x;j<cols;j++)
        //do something

但这样做只会让我访问一些字段:vistied fields sample

我需要访问这张图片中突出显示的所有字段:required

那么修复它的最简单方法是什么?

【问题讨论】:

    标签: java arrays matrix


    【解决方案1】:

    你应该检查它是否是外循环的第一次迭代:

    for(int i = row_x; i < rows; i++)
      for(int j = (i == row_x ? col_x : 0); j < cols; j++)
        //do something
    

    【讨论】:

    • 谢谢,这是一个很好的答案。
    【解决方案2】:

    一种解决方案是将您的二维数组结构更改为一维数组并在一维中工作(而不是通过算法)然后应用:

    init = rows*i+j;
    
    for(int l = init; l<size;i++){
        //do things
    }
    

    【讨论】:

    • " 你也会获得更好的算法复杂度(O(n) 而不是 O(n²) ) " 这种说法具有误导性。您还忘记了您已经花时间将 2D 数组转换为 1D。如果矩阵的维度为N x N,其中N = 8,那么在最坏的情况下你有二维O(8²)。如果您首先将其转换为 1D,则您正在使用 O(8²) 进行转换。然后你正在访问最坏情况下的一维数组......O(8 x 8) = O(8²)......所以如果你使用~符号(2D:~O(8²) vs 1D:~ 2 O(8²)),你在这里有双重工作。跨度>
    • @KarelG 我并不是要通过算法进行转换,只是建议他在没有必要时使用一维数组而不是二维数组。也感谢您的评论。
    【解决方案3】:

    不要开始你的内部循环(从 col_x 开始循环列迭代,而是从第 0 个索引(第一列)开始。 这将涵盖required中给出的字段

    【讨论】:

    • 您可以提供代码示例或将此答案作为评论。
    猜你喜欢
    • 2021-11-03
    • 2016-03-03
    • 2011-07-18
    • 2017-10-24
    • 1970-01-01
    • 2015-04-07
    • 2016-09-04
    相关资源
    最近更新 更多