xo294   4년 전

미로 찾기를 BFS로 하는데 완전 탐색이 됩니다...

BFS의 원리를 잘 모르는 건지 QUEUE를 잘못 짠 건지 잘 모르겠습니다...  

혹은 최단 경로를 해야한다고 생각하는데, 그 방법을 모르겠습니다.

많이 고민해봤는데 잘 안되네요.. 도와주시면 감사하겠습니다,,

ohyuni   4년 전

maze_explore 시작할 때 x, y 값을 enqueue 하는 부분이 빠진 것 같아요.

ohyuni   4년 전

추가로, 방문 여부를 표시하는 배열이 필요해 보입니다.

거리를 구하는 문제는 거리 배열을 따로 선언하여 매번 값을 갱신해주는 방법도 있고,

큐에 위치 정보를 저장할 때 거리 값도 함께 저장하는 방법도 있습니다.

jung2381187   4년 전

추가로 queue 크기가 너무 작습니다. 지금 크기 100으로 설정되어 있는데 최악의 경우에 100*100칸 모두가 들어갔다 나올 수 있으므로 넉넉히 20000 정도는 되어야 합니다.

jung2381187   4년 전

지금 보니 maze_explorer 함수가 재귀함수네요. maze_explorer 함수에 지금 구현된 부분이 통째로 while (!is_empty() != 0) 반복문 안으로 들어가야 합니다. 재귀는 빼고요. 그리고 각 칸의 거리를 구하는 방법도 구현돼야 합니다.

xo294   4년 전

두 분 모두 질문 감사합니다..! 질문을 토대로 구현하려고 노력해봤는데 해결되지 않은 부분이 있습니다.

maze_explore를 시작할때 x,y 즉 (0,0)을 enqueue하는 부분을 구현했습니다. 그래서 queue[0]과 queue[1]은 (0,0)으로 저장되었습니다. 

(왜 구현하라고 한지는 의문이었으나, 그렇지 않으면 while(!is_empty() != 0)을 충족시킬 수 없었습니다.)

이 부분을 통해 기존에 없던 while(!is_empty() != 0)을 구현한 조건을 true로 만들어 반복문을 돌아가게 하는 것에는 성공하였으나, dequeue하는 부분에서 (0,0)이 출력되는 상황이 발생하였습니다... 따라서 정상적으로 queue되지 않고(0, 0)으로 무한 루프에 빠지게 되었습니다.

수정하려고 노력하였으나, 하나를 수정하면 다른 한 부분에서 오류가 나는 상황이라 어떻게 고쳐야 할 지 잘 모르겠네요,,

각 칸의 거리라는 부분을 잘 모르겠습니다. 시작점으로 부터 queue를 하면서 이르는 거리를 의미하는 것 맞나요?

최단경로를 만들때 maze의 크기와 같은 배열을 하나 더 생성하여 minimum에 해당하는 값만 입력되도록 하면 될까요? 그리고 이 부분에 문제점은 여러개의 값을 저장하는데 앞서, maze[y][x+1] = '0'과 같은 부분이 0으로 먼저 초기화를 시켜 방해한다고 생각합니다. 제 생각이 맞다면, 이 부분을 개선해야 할까요?

큰 크기의 배열을 너무 많이 선언하면 메모리 할당량이 너무 커지는 것 같아 걱정됩니다.  원래 이러한 문제인가요?  아니면 다른 방법이 존재할까요?

적다보니 BFS 개념도 많이 부족해 설계가 잘못된 것 같아 추가 공부를 하긴 해야할 것 같아요.. 그래도 부족한 질문 읽어주셔서 감사하고, 부족한 부분 채워주시면 감사하겠습니다...

ohyuni   4년 전

무한루프에 빠진다는 게 어떤 걸 뜻하는지 자세히 설명해주실 수 있을까요?

각 칸의 거리는 말씀하신 대로 maze와 크기가 같은 배열 distance가 있다고 했을 때 각 칸에 도착하는 데 걸리는 거리를 저장하는 것을 말합니다.

큰 크기의 배열 지금까지 총 세 개(maze, visited, distance) 맞나요? 제 생각에는 세 개 정도까지는 큰 문제가 없을 것 같습니다. 그럼에도 걱정되신다면 distance 배열을 visited 배열로 활용할 수 있는 방법이 있어요. 한번 고민해보셔요.

그리고 C++ STL queue를 쓰실 생각은 없나요? 구글에 검색하면 알기 쉽게 쓰인 자료들이 많아요!!

xo294   4년 전

아... dequeue하는 과정에서 (0, 0)으로만 출력되서 문제라고 생각해서 그 부분이 무한루프라고 생각했는데, 재귀함수를 빼니까 아무 의미 없는 선언이 되어버렸네요..

다시 생각해보니 재귀함수를 빼버리니까 이동이 안되네요..

죄송해요 처음에는 쉽다고 생각했는데 막상 막히고 나니까 어떻게 해야할지 감이 안잡히네요..ㅠ visit 함수를 아직 구현 못하기도 했고, BFS도 다시 공부해보고 내일 다시 한번 도전한 뒤에 질문해야 할 것 같아요..

질문 받아주셔서 감사하구 좋은 밤 되세요..

STL library를 사용하기 위해 C++ 배울 계획 있어요..! 원랜 이 문제부터 적용하려고 했는데 이 문제도 어려워서,,,ㅜㅜㅜ

이 문제만 풀고 다음 문제부터는 적용하도록 할게요 ㅋㅋㅋㅠ 

xo294   4년 전

Test Case 4개가 전부 맞아서 기쁜 마음으로 제출했으나... 런타임 에러가 발생하네요 ㅠㅠ 이유를 알 수 있을까요?

MAX를 101로 바꿔보거나 QUEUE[10001]로 바꿔봤는데도 잘 안되네요,,ㅠ

ohyuni   4년 전

반례 첨부합니다.

while loop 안에 갇히네요.

xo294   4년 전

자꾸 통과못하고 틀려 질문하여 죄송합니다... ㅠ 내주신 Test Case 를 통과하고 제출하였으나 시간초과가 되었습니다..

이를 개선하기 위해  maze[tmp.y][tmp.x + 1] = '0'; 와 같은 작업을 하여 queue에 반복되어 삽입이 되는 과정을 없앴다고 생각하였으나 그래도 시간초과가 발생합니다.

어떤 부분이 잘못되었는지 알 수 있을까요?

xo294   4년 전

해결했습니다.. MAX를 100이 아니라 101이상으로 주었어야했네요 ㅠㅠ

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