Я изучаю 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';
}
}
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
maze
вместо layout
, что указывает на то, что он уже реализовал искомый массив. Вместо этого, похоже, это ошибка кодирования.
Оператор 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
.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
return
закрывает вашу текущую функцию; добавьте переменнуюtotal
и добавьте к ней+= 1 + roomSize(...
. Затем, в конце,return total;
. Причина этого в том, что ваш код завершится при первом операторе возврата.