Я изучаю 12-й класс compsci, и у меня возникла проблема с рекурсией. В контексте этой проблемы меня просят найти количество открытых пространств в комнате с учетом начальной строки и столбца.

«X» обозначает стены, а «O» - открытое пространство. Открытое пространство считается только в том случае, если они прилегают друг к другу, а не по диагонали.

При таком макете комнаты myHouse.roomSize (1,1) вернет 21, а myHouse.roomSize (5,9) вернет 5. если начальная строка или столбец - стена, он вернет 0.

 012345678901234567
0XXXXXXXXXXXXXXXXXX
1XOOOOOOXOOOOOOOOOX
2XXXXOOOXOOOOOOOOOX
3XOOOOOOXOOOOOOOOOX
4XOOXXXXOXXXOOOOOOX
5XOOOOXXOOOOXXXOOXX
6XXXXXXXXXXXXXXXXXX

Если бы кто-нибудь мог дать мне несколько советов о том, как решить эту проблему с помощью рекурсии

Буду безмерно признателен, спасибо.

Изменить: вот моя попытка решить это до сих пор, Edit2 (теперь отформатирован): изменен лабиринт на макет

public int roomSize (int row, int col)
{
    if (layout[row][col] == 'X'|| layout [row][col]== '*')
        return 0;
    if (layout[row][col] == 'O')
    {
    layout[row][col]='*';
    return 1 + roomSize(row + 1, col);
    return 1 + roomSize(row, col + 1);
    return 1 + roomSize(row - 1, col);
    return 1 + roomSize(row, col - 1);
    layout[row][col]='O';
    }
}
1
user3491822 3 Апр 2014 в 05:58
1
Одна вещь, которую требует сайт, это то, чтобы вопросы включали подробности о том, что вы пытались до сих пор.
 – 
danh
3 Апр 2014 в 06:01
Это довольно сложная задача для 12-го класса CS.
 – 
aliteralmind
3 Апр 2014 в 06:07
return закрывает вашу текущую функцию; добавьте переменную total и добавьте к ней += 1 + roomSize(.... Затем, в конце, return total;. Причина этого в том, что ваш код завершится при первом операторе возврата.
 – 
Aarowaim
3 Апр 2014 в 06:26
Так это должно выполняться с помощью рекурсии?
 – 
Baby
3 Апр 2014 в 06:29

2 ответа

Лучший ответ

Псевдокод в помощь не хочет делать вашу работу за вас

int roomSize(int row, int col)
|   bool [x][y] v; //Array to stored visited values x is the width of the maze y is the height
|     set all bools in v to false
|    return doRoomSize(row,col, v) 
end

int doRoomSize(int r, int c, v)
|    if( v[r][c] = true ||  layout [r][c]='X' )
|     | return 0
|    end-if
|    //Now we know that its a good value
|    
|This is a maze type problem so what you need to do is


int roomSize(int row, int col)
|   bool [x][y] v; //Array to stored visited values x is the width of the maze y is the height
|     set all bools in v to false
|    return doRoomSize(row,col, v) 
end

int doRoomSize(int r, int c, v)
|    if( v[r][c] = true ||  layout [r][c]='X' )
|     | return 0
|    end-if
|    //Now we know that its a good value
|    v[r][c] = true; // we have seen this point so we addit to visted
|      int n=1;
|    //Check left
|         n+= doRoomSize(r-1, c)
|    //Check right
|        n+=doRoomSize(r+1,c)
|   //Check up 
|        n+=doRoomSize(r,c-1)
|  // Check down
|        n+=doRoomSize(r,c+1)
|     return n;
end-method
0
TheBetaProgrammer 3 Апр 2014 в 06:32
Его проблема не в непонимании алгоритма. Обратите внимание на использование им maze вместо layout, что указывает на то, что он уже реализовал искомый массив. Вместо этого, похоже, это ошибка кодирования.
 – 
Aarowaim
3 Апр 2014 в 06:35
Я не очень понимаю, почему вы сделали логический массив. Что я сделал, так это изменил исходный массив, чтобы изменить его на «*», это тоже нормально?
 – 
user3491822
3 Апр 2014 в 06:42
Если вам разрешено быть разрушительным с вашим кодом (изменить значения массивов), вам не нужен логический массив.
 – 
TheBetaProgrammer
3 Апр 2014 в 06:45

Оператор return немедленно завершает функцию; предполагается, что результат был найден и дальнейшие вычисления не требуются. Ваша функция завершится после return 1 + roomSize(row + 1, col);, предполагая, что она нашла результат. Вместо этого я рекомендую вам использовать переменную sum или total, которую вы возвращаете после выполнения остальной части функции.

Попробуй это:

public int roomSize (int row, int col) {
    if (layout[row][col] == 'X'|| layout [row][col]== '*')
        return 0;
    if (layout[row][col] == 'O') {
        int total = 1;

        maze[row][col]='*';
        total += roomSize(row + 1, col);
        total += roomSize(row, col + 1);
        total += roomSize(row - 1, col);
        total += roomSize(row, col - 1);
        maze[row][col]='O';
    }
}

РЕДАКТИРОВАТЬ: вы меняете значение maze на *, но когда вы проверяете * в строке ...layout[row][col] == '*'), вы не проверяете maze.

0
Aarowaim 3 Апр 2014 в 06:38