whj6973   6년 전

그냥 up(arr) right(arr) 식으로 호출을하면 결과는 맞게 나오는데 재귀과정에서 돌아오면서 배열이 복원되지 않습니다.

예를들어 '업->업->업->업->다운' 으로 이동을 마치고 네번째 '업'으로 돌아와서 '업->업->업->업->레프트'이 되야하는데  네번째 '업'의 결과가 아닌 이전 이동에서 '다운'의 결과에서 '레프트'가 됩니다.....

도와주세요 ㅠㅠ

rdd6584   6년 전

질문 내용만 보고 답변하는거라, 원하는 답변이 될지 모르겠네요.

배열을 함수인자로 넘길때 값이 아닌 레퍼런스로 넘겨지기 때문에 말씀하신 증상이 나타나는게 아닐까 싶습니다.


저 같은 경우에는 원본 배열을 따로 빼두고 재귀를 마친다음에 원본 배열을 또 가져오는 방법으로 해결합니다.

memcpy(temp, mat, sizeof(mat));
for (i = x + 1; mat[i][y] == '.'; i++)
mat[i][y] = '*';
c1 = go(i - 1, y) + 1;
memcpy(mat, temp, sizeof(mat));

이런식으로요

whj6973   6년 전

배열을 복사할 때 int[][] temp = arr; 식이 아니라

int[][] temp = new int[n][n];

for(int i =0; i<n; i++) {

for(int j=0; j<n; j++) {

temp[i][j] = arr[i][j];

}

}

식으로 했더니 결과가 맞았습니다ㅎㅎㅎㅎ

dfs()뿐만아니라 up(), down(), left(), right() 모두 위와같이 변경해줘야합니다.


frigrammer   6년 전

int arr[][] 대신에 vector<vector<int>> 로 넘기면 call by value로 들어갑니다.

메모리가 넉넉한 문제에서 사용하시면 유용합니다.


댓글을 작성하려면 로그인해야 합니다.