【问题标题】:issue with for loops in 2D array program二维数组程序中的for循环问题
【发布时间】:2014-02-13 16:45:04
【问题描述】:

好的,所以我目前的任务是让我编写一个可以模拟渗透的程序,这意味着它必须读取一个数组,其中 1 表示空间关闭,0 表示空间打开。接下来,它必须将数组顶行的所有 0 更改为 2,表示正在倒入的液体。然后液体可以跟随 0(表示流动),一路将它们全部更改为两个。液体可以上下左右移动。不是对角线。我的程序几乎可以工作,但是 for 循环似乎没有超过数组的第一行。

public class Percolation2 {
    public static void main (String[] args) {
        int[][] filter1 = {{1,0,1,0,1,1,0}, 
                {1,0,1,1,1,0,0},
                {0,0,0,1,0,0,1},
                {1,1,0,1,1,1,1}, 
                {1,0,0,1,1,0,1},
                {1,0,1,0,1,0,1},
                {0,0,0,0,1,1,0}, 
                {1,1,1,0,1,0,1}};
        for(int i=0; i<7; i++) {
            if(filter1[0][i] ==0) {
                filter1[0][i] = 2;
            }
        }

        for ( int i = 0 ; i < filter1.length ; i++ ) {
            for ( int j = 0 ; j < filter1[i].length ; j++ ) {

                if ( filter1[i][j] == 0 )

                    if(i-1 > 0 && filter1[i-1][j] == 2)
                        filter1[i][j] = 2;

                    if(i+1 < 7 && filter1[i+1][j] ==2)
                        filter1[i][j] = 2;

                    if(j-1 > 0 && filter1[i][j-1]==2)
                        filter1[i][j] = 2;

                    if(j+1 < 7 && filter1[i][j+1] == 2)
                        filter1[i][j] = 2;
            }
        }

        for(int i = 0; i < filter1.length; i++) {
            for(int j = 0; j < filter1[i].length; j++) {
                System.out.print(filter1[i][j]);
                if(j < filter1[i].length - 1) System.out.print(" ");
            }
            System.out.println();
        }
    } 
}

我的输出如下:

2 2 2 2 2 2 2
1 0 1 1 1 0 0
0 0 0 1 0 0 1
1 1 0 1 1 1 1
1 0 0 1 1 0 1
1 0 1 0 1 0 1
0 0 0 0 1 1 0
1 1 1 0 1 0 1

所以你可以清楚地看出它没有正确循环。

【问题讨论】:

  • 我建议您使用适当的缩进来格式化您的代码。这将使阅读更容易。您是否也尝试过使用调试器来观察程序的逐步执行情况?
  • 在我看来,您(至少)在双 for 循环中 if(filter1[i][j] == 0) 之后的代码周围缺少一个花括号。你的第一行不应该是1 2 1 2 1 1 2 ...不是所有2s?
  • if(filter1[i][j] == 0) 在第二个循环中。第一行不包含任何 0 为何跳过此守卫。
  • 好吧,他“手动”做了第一行,双 for 循环将有效地跳过第一行(没有 0s),但应该继续其他人,当 @987654330 @.

标签: java arrays loops multidimensional-array


【解决方案1】:

每转一圈,液体可以移动一层。你的 for 语句是正确的,数组的所有元素都被访问了。您需要另一个循环来获得适当的转数。

我不想直接给你答案,因为这里有一个教训要学习,你需要有这样的东西:

//Init
boolean done = false;

while(!done) {

   for (int i = 0; i < filter1.length; i++) {
     for(int j = 0; j < filter1[i].length; j++) {
        if(filter1[i][j] == 0)
        ....
     }
   }

   //add the print matrix code here if you want it done after each turn.

   done = amIDone();
}

总体而言,您的代码结构非常糟糕。您应该对数组长度使用常量,您还可以为两个双重嵌套的 for 循环定义方法。在最低限度,我会有一个printMatrix() 方法。

【讨论】:

  • 以上代码不完整。正如他所说,他不会直接给你答案。
  • 我似乎无法获得进入 cmets 的代码,但我只是继续努力。谢谢大家
  • 要将代码添加到此处的注释中,请用反引号将代码括起来。那是1 左边的按钮......上面也有~。
【解决方案2】:

我在这里看到了几个问题:

1) 在双 for 循环中,您似乎在 if(filter1[i][j] == 0) 之后的代码块周围省略了大括号。

2) 在此之下,您的越界检查不正确 if(i-1 &gt; 0 &amp;&amp; ... 应该是 if(i-1 &gt;= 0 &amp;&amp; ...。而且,if(j+1 &lt; 7 &amp;&amp; ... 应该是 if(j+1 &lt; 8 &amp;&amp; ...

3) 在你的问题中你说你的输出是2 2 2 2 2 2 2 ... 。但是你的代码会产生不同的结果,你的输出应该是1 2 1 2 1 1 2 ...。这就是我运行for(int i=0; i&lt;7; i++) { if(filter1[0][i] == 0) { filter1[0][i] = 2; } } 时得到的结果

4) 皮特暗示了这个问题。但更具体地说,您正在对矩阵(二维数组)进行一次传递。没有能力随液体上升(也不离开)。

让我们将这些项目称为单元格。当一个细胞变成液体时(又名它变成== 2),它应该将该液体渗透到相邻的空细胞(又名设置为0)。这听起来像是在呼吁递归,恕我直言!

一旦你解决了前三个问题。将您的双 for 循环的有效负载放入递归函数中,如下所示:

public void percolate(int x, int y) {
    if ( filter1[x][y] == 0 ) {
        if(x-1 >= 0 && filter1[x-1][y] == 2) filter1[x][y] = 2;
        if(x+1 < 7 && filter1[x+1][y] == 2) filter1[x][y] = 2;
        if(y-1 >= 0 && filter1[x][y-1] == 2) filter1[x][y] = 2;
        if(y+1 < 8 && filter1[x][y+1] == 2) filter1[x][y] = 2;
        if ( filter1[x][y] == 2 ) {
            if ( x-1 >= 0 ) percolate(x-1,y);
            if ( x+1 < 7 ) percolate(x+1,y);
            if ( y-1 >= 0 ) percolate(x,y-1);
            if ( y+1 < 8 ) percolate(x,y+1);
        }
    }
}

然后只需为双 for 循环中的每个单元格调用它。实际上,由于液体从顶部开始,我想您可以只为 second 行中的每个单元格调用 percolate。它会从那里向下渗透。

如您所见,这不是最有效的解决方案,它会双重/三重检查某些单元格上的渗透。但这是纤薄的螺母和螺栓版本。

编辑:修正 typeos,去掉不必要的布尔值。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多