2014-02-13 2 views
0

Хорошо, поэтому мое текущее задание позволяет мне создать программу, которая может имитировать перколяцию, что означает, что она должна читать массив, где 1 означает, что пространство закрыто, 0 означает, что пространство открыто. Затем он должен изменить все 0 в верхней строке массива на 2, представляя жидкость, в которую наливают. Затем жидкость может следовать за 0 (представляя поток), изменяя их все на два по пути. Жидкость может двигаться вверх, вниз, влево и вправо. не диагональ. У меня почти работает моя программа, но циклы for не проходят больше, чем первая строка массива.Проблема с циклами в программе 2D-массива

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 

Таким образом, вы можете четко сказать, что это не зацикливание должным образом.

+1

Я предлагаю вам отформатировать код с правильным отступом. Это облегчит чтение. Также вы пытались использовать отладчик для наблюдения за пошаговым исполнением вашей программы? –

+2

Похоже, что вы (по крайней мере) не видите фигурного скобки вокруг кода после 'if (filter1 [i] [j] == 0)' в двойном цикле 'for'. И не должна ваша первая строка быть '1 2 1 2 1 1 2' ... не все' 2 's? –

+0

'if (filter1 [i] [j] == 0)' во втором цикле. Первая строка не содержит 0, почему этот защитник пропущен. –

ответ

0

Каждый оборот жидкости может перемещаться на один уровень. Ваши утверждения корректны, все элементы массива посещаются. Вам нужен еще один цикл для правильного количества поворотов.

Я не хочу, чтобы дать вам ответ непосредственно как есть урок здесь, вы должны иметь что-то вроде:

//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(); 
} 

Общий код структурирована довольно слабо. Вы должны использовать константы для длины массива, и вы также можете определить методы для двух двух вложенных циклов. На голом минимуме у меня был бы метод printMatrix().

+0

Я пробовал выше, все еще получил тот же результат – user3267872

+1

Вышеуказанный не полный код. По его словам, он не собирался дать вам прямой ответ. –

+0

Тогда ваша кодировка неверна. –

0

Я вижу несколько проблем здесь:

1) Вы, казалось, опустили фигурные скобки вокруг блока кода, следующего if(filter1[i][j] == 0) в вашем двойном for цикле.

2) Ниже уточните сумму ошибки if(i-1 > 0 && ... должно быть if(i-1 >= 0 && .... И, if(j+1 < 7 && ... должно быть if(j+1 < 8 && ...

3) В вашем вопросе вы говорите, что ваш выход 2 2 2 2 2 2 2 .... Но ваш код дает разные результаты, ваш результат должен быть 1 2 1 2 1 1 2 .... То, что я получаю при запуске for(int i=0; i<7; i++) { if(filter1[0][i] == 0) { filter1[0][i] = 2; } }

4) Пит намекает на проблему. Но более конкретно, вы делаете один проход вниз по матрице (2D-массив). Нет способности подниматься с жидкостью (и не лечь).

Позволяет называть эти элементы ячейками. И когда ячейка становится жидкой (a.k.a. она превращается в == 2), она должна просачивать эту жидкость в соседние ячейки, которые пусты (a.k.a. установлены на 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 цикле. На самом деле, так как жидкость начинается сверху, я думаю, вы могли бы просто называть это percolate для каждой ячейки только в секундах. Он будет просачиваться вниз и кругом оттуда.

Как вы можете видеть, это не самое эффективное решение, это двойные/тройные проверки на перколяцию на некоторых ячеек. Но это тонкая версия с гайками и болтами.

РЕДАКТИРОВАТЬ: Исправлен тип, избавился от ненужного булева.

Смежные вопросы