2011-11-30 3 views
1

어떤 방법 으로든 스택의 링크 된 목록 구현을 사용하여 미로에 대한 솔루션을 생성합니다. 미로는 .txt 파일에서 읽혀지며 열린 공간에는 0, 벽에는 1로 구성됩니다. enter image description here < - 출구가 맨 아래 행에 있어야하나요? 그럼 3 개의 0이야?스택으로 미로 경로 솔루션 기록하기

내가 사용하려고 오전 알고리즘은 : 나는 시도했습니다

While Not At End 
    If Can Go North 
     Go North 
    ElseIf Can Go East 
     Go East 
    ElseIf Can Go South 
     Go South 
    ElseIf Can Go West 
     Go West 
    EndIf 
Wend 

그것을 사용하는 방법은 배열 인덱스 내에서 실행 ++ 작업에 의존했다. 나는 배열 첨자 연산자 [++보다 우선 순위를 가졌으므로 지금은 주위에서 일할 것을 다시 생각해야한다. 그렇게하기 전에, 나는이 방법이 처음부터 잘 작동하는지 확인하기를 원합니다. 누구든지 지금까지 내 알 고안 코드를보고 일부 피드백을 제공 할 수 있습니까? (참고 : 난 아직도 무한 루프의 몇 가지 유형을 피하기 위해 이동 경로를 추적하기 위해 몇 가지 코드에 추가해야합니다) ++ 전에 [실행과

bool notSolved = true; 
     int path = 0; 
     row = 0; 
     col = 0; 

     rowStack.push(row); 
     colStack.push(col); 

     while (notSolved){ 

     //(from perspective of person looking at maze on screen) 
     if (maze[row--][col] == 0){//if you can go up, go up 
     rowStack.push(row); 
     colStack.push(col); 
     path++; 
     } 
     else if (maze[row][col++] == 0){//else if you can go right, go right 
     rowStack.push(row); 
     colStack.push(col); 
     path++; 
     } 
     else if (maze[row++][col] == 0){//else if you can go down, go down 
     rowStack.push(row); 
     colStack.push(col); 
     path++; 
     } 
     else if (maze[row][col--] == 0){//else if you can go left, go left 
     rowStack.push(row); 
     colStack.push(col); 
     path++; 
     } 

      if((maze[row][col] == 0) && (row == (size - 1))){//if we reached an exit 
       cout << "Solution Path:" << endl; 
       for (int i = 0; i < path; i++){ 
        cout << "row:" << rowStack.top() << " col:" << colStack.top() << endl; 
        rowStack.pop(); 
        colStack.pop(); 
       } 
      notSolved = false; 
      } 
     } 

문제 : enter image description here

감사 어떤 도움을 주셔서 감사합니다!

+3

재귀는이 중 하나입니다. – Erix

+0

특정 질문이 있으십니까? –

+0

알고리즘이 특히 좋다고 생각하지 않습니다. 예를 들어 수평 터널에서 오른쪽 벽을 돌면, 오른쪽에서 왼쪽으로 영원히 튀어 오를 수 있습니다. –

답변

2

순환 경로가있는 특정 미로에서는 알고리즘이 작동하지 않습니다.이 중 하나에 도달하면 원형으로 이동하게됩니다. 이 문제를 해결하려면 [R] [C] [DIR]을 방문한 부울 배열을 추가해야합니다. 여기서 DIR은 방향을 나타내는 0에서 3까지의 숫자입니다. 셀 [r] [c] 방향을 [d] 방향으로두면 방문한 [r] [c] [d]를 true로 설정합니다. 다음 번에 같은 셀을 방문 할 때 이전에 같은 방향으로 놓았는지 확인하십시오. 그랬다면 그 방향을 건너 뛰고 그 다음 줄을 따라 가라.

+0

흠, 방문한 어레이가 작동한다고 생각하지만 문제가 있습니다. if 문에 구현하는 더 좋은 방법이 있을까요? 문제는 다음과 같습니다. http : //imgur.com/5rstN, 오른쪽, 아래, 오른쪽, 오른쪽으로 이동하여 벽을 치고 돌아 서서 붙어 있습니다. 다음은 새로운 코드입니다. http : //pastebin.com/uhp9MKfc – darko

+0

@mwmnj 현장에 있었는지 확인하기위한 코드는 좋았습니다. 이제는 역 추적을 구현해야합니다. '붙어있어.' 귀하의 경우에는 rowStack/colStack에서 마지막 단계를 건너 뛰고 이전 셀로 돌아가서 이전에 시도하지 않은 다음 방향으로 계속 진행해야합니다. – dasblinkenlight

+0

흠, 처음에는 else 끝에 else를 추가합니다. else else // 붙어 있다면 rowStack.pop(); colStack.pop(); 행 = rowStack.top(); col = colStack.top(); }'하지만 지금까지해야 할 일은 스택이 텅 비기 전까지 스택의 맨 위에있는 모든 이전 단계를 터뜨리는 것입니다. – darko

0

++--은 실제로 행/열 변수를 수정합니다. 나는 당신이 maze[row - 1][col] == 0을하고 싶다고 생각하고 옮긴 후에 행 위치를 업데이트하십시오.