Перепутал код рекурсии для настольной игры - PullRequest
0 голосов
/ 03 апреля 2012

Что мне нужно сделать здесь, так это подсчитать количество смежных белых блоков (в 2-х) на квадратной доске, которая состоит из случайных черных (0-х) и белых (1-х) блоков.Белые блоки должны быть на i+1,j ||i-1,j ||i,j+1 ||i,j-1.Технически диагонали не учитываются.Я привел пример ниже:

 [1 0 1]
 [1 1 0]
 [0 1 0]

Здесь count == 3 (0,0)(1,0) and (1,0)(1,1) and (1,1)(2,1)

Вот мой код:

public int count = 0;
    boolean count(int x, int y, int[][] mat)
    {
        if(x<0 || y<0)
            return false;
        if(mat[x][y] == 0)
            return false;

        for(int i = x; i<mat.length; i++)
        {
            for(int j = y; j<mat[0].length; j++)
            {
                if(mat[i][j] == 1)
                {
                    mat[i][j] = 0;
                    if(count(i-1,j,mat))
                        count++;
                    if(count(i,j-1,mat))
                        count++;
                    if(count(i+1,j,mat))
                        count++;
                    if(count(i,j+1,mat))
                        count++;
                }
            }
        }
        return true;
    }

Краткое объяснение того, что я пытаюсьделать здесь: я собираюсь найти 1 на доске, и когда я нахожу один, я изменяю его на 0 и проверяю его вверх, вниз, влево, вправо на 1. Это продолжается до тех пор, пока я не найду соседние 1.Что мне здесь не хватает?Я как бы чувствую, что зацикливаюсь излишне.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

вот решение без рекурсии

for(int i = 0; i < mat.length; i++) {
    for(int j = 0; j < mat[i].length; j++) {
       if(mat[i][j] == 1) {
          if(i < mat.length - 1 && mat[i+1][j] == 1) {
              count++;
          }
          if(j < mat[i].length - 1 && mat[i][j+1] == 1) {
              count++;
          }
    }
}
1 голос
/ 03 апреля 2012

Я не думаю, что рекурсия - это правильный ответ, так как вам нужно идти только на один шаг вглубь (чтобы найти смежное значение). Вместо этого просто просматривайте элементы, смотрящие вправо и вниз. Не смотрите вверх или влево, как упомянуто, чтобы не удваивать количество совпадений. Тогда это просто:

for (i=0; i<max; i++)
  for (j=0; j<max; j++)
    if (array[i][j] == 1){
         if (i<max-1 && array[i+1][j] == 1) count++;
         if (j<max-1 && array[i][j+1] == 1) count++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...