2012-04-12 2 views
2

이것이 내 첫 번째 질문이며, 그렇습니다. 숙제 임무입니다. 나는 몇 시간 동안 그 일을 해왔지만 알고리즘을 작동시킬 수는 없다. 필자가 작성한 프로그램은 12x12 배열을 받아들이고 끝까지의 경로를 찾는 함수를 포함하고 있다고 가정합니다. main 함수는 미로의 시작을 찾아 "x"로 변경하여 "player"의 위치를 ​​나타냅니다. 그런 다음 main 함수는 배열을 받아들이는 mazePrint 함수를 호출하여 화면을 지운 후에 인쇄합니다. 그런 다음 배열을 받아들이는 mazeTraversal 함수를 호출합니다. mazeTraversal의 첫 번째 부분은 "x"의 위치를 ​​찾고 "." 다음 부분은 "x"가 향하고있는 방향을 결정하기로되어 있습니다. 제가 직면하고있는 방식을 표현하기 위해 4, 5, 6, 8 (서쪽, 남쪽, 동쪽, 북쪽 (숫자 패드를보십시오))을 사용했습니다. 그것이 향하는 방법을 기반으로, mazeTraversal은 오른쪽에 열린 경로가 있는지를 결정하고, 그 다음 앞에, 왼쪽, 그리고 뒤 그리고 나서 그 위치에 X를 놓고 x가 바뀌는 방식을 변경하려고 시도합니다 면함. 프로그램을 실행할 때 두 번째 이동 후에 뭔가 잘못되었습니다. 어떤 도움을 주셔서 감사합니다. 그런 질문이있는 곳이 아닌 경우 미안합니다.C에서 우회 미로 탐색

#include <stdio.h> 
#include <stdlib.h> 

void mazePrint(char *maze[12][12]); 
void mazeTraversal(char *maze[12][12]); 
static int face = 6; 

main() 
{ 
    int i = 0; 
    int j = 0; 
    int k = 0; 
    int start; 
    int xpos; 

    char *mazeone[12][12] = { 
     //0///1///2///3///4///5///6///7///8///9///10//11/// 
     "#","#","#","#","#","#","#","#","#","#","#","#",//0 
     "#",".",".",".","#",".",".",".",".",".",".","#",//1 
     ".",".","#",".","#",".","#","#","#","#",".","#",//2 
     "#","#","#",".","#",".",".",".",".","#",".","#",//3 
     "#",".",".",".",".","#","#","#",".","#",".",".",//4 
     "#","#","#","#",".","#",".","#",".","#",".","#",//5 
     "#","#",".","#",".","#",".","#",".","#",".","#",//6 
     "#","#",".","#",".","#",".","#",".","#",".","#",//7 
     "#",".",".",".",".",".",".",".",".","#",".","#",//8 
     "#","#","#","#","#","#",".","#","#","#",".","#",//9 
     "#",".",".",".",".",".",".","#",".",".",".","#",//10 
     "#","#","#","#","#","#","#","#","#","#","#","#",};//11 

    for (i = 0; i <12; i++) 
     if (mazeone[i][0] == ".") { 
      start = i; 
      mazeone[start][0] = "x"; 
      xpos = start; 
      break; 
     } 

    printf("X is the starting point.\n"); 
    printf("Press Space Bar to watch the X move.\n\n\n"); 
    getchar(); 
    mazePrint(mazeone); 
    getchar(); 
    return 0; 
} 

void mazePrint(char *maze[12][12]) 
{ 
    int x = 0; 
    int y = 0; 

    system("cls"); 
    for (x = 0; x < 12; x++) { 
     for (y = 0; y < 12; y++) { 
      printf("%s", maze[x][y]); 
     } 
     printf("\n"); 
    } 
    getchar(); 
    mazeTraversal(maze); 
} 

void mazeTraversal(char *maze[12][12]) 
{ 
    int x = 0; 
    int y = 0; 

    for (x = 0; x < 12; x++) { 
     for (y = 0; y < 12; y++) { 
      if (maze[y][x] == "x") 
       break; 
     } 
     if(maze[y][x] == "x") 
      break; 
    } 

    for (y = 0; y < 12; y++) { 
     for (x = 0; x < 12; x++) { 
      if (maze[y][x] == "x") 
       break; 
     } 
     if (maze[y][x] == "x") 
      break; 
    } 

    maze[y][x] = "."; 

    switch (face) { 
     case 6:{ 
      if (maze[y][x-1] == ".") { 
       maze[y][x-1] = "x"; 
       face = 5; 
      } else if (maze[y + 1][x] == ".") { 
       maze[y + 1][x] = "x"; 
       face = 6; 
      } else if (maze[y][x+1] == ".") { 
       maze[y][x+1] = "x"; 
       face = 8; 
      } else if (maze[y - 1][x] == ".") { 
       maze[y - 1][x] = "x"; 
       face = 4; 
      } 
     } 
     case 8:{ 
      if (maze[y + 1][x] == ".") { 
       maze[y + 1][x] = "x"; 
       face = 6; 
      } else if (maze[y][x+1] == ".") { 
       maze[y][x+1] = "x"; 
       face = 8; 
      } else if (maze[y - 1][x] == ".") { 
       maze[y - 1][x] = "x"; 
       face = 4; 
      } else if (maze[y][x-1] == ".") { 
       maze[y][x-1] = "x"; 
       face = 5; 
      } 
     } 
     case 4:{ 
      if (maze[y][x+1] == ".") { 
       maze[y][x+1] = "x"; 
       face = 8; 
      } else if (maze[y - 1][x] == ".") { 
       maze[y - 1][x] = "x"; 
       face = 4; 
      } else if (maze[y][x-1] == ".") { 
       maze[y][x-1] = "x"; 
       face = 5; 
      } else if (maze[y + 1][x] == ".") { 
       maze[y + 1][x] = "x"; 
       face = 6; 
      } 
     } 
     case 5:{ 
      if (maze[y - 1][x] == ".") { 
       maze[y - 1][x] = "x"; 
       face = 4; 
      } else if (maze[y][x-1] == ".") { 
       maze[y][x-1] = "x"; 
       face = 5; 
      } else if (maze[y + 1][x] == ".") { 
       maze[y + 1][x] = "x"; 
       face = 6; 
      } else if (maze[y][x+1] == ".") { 
       maze[y][x+1] = "x"; 
       face = 8; 
      } 
     } 
    } 

    mazePrint(maze); 
} 
+1

당신은 stackoverflow를 위해 4 개의 공백으로 소스를 들여 썼다. 불행히도 일부 줄의 들여 쓰기는 하드 탭을 사용하여 이루어 지므로 엉망이되었습니다. – Kaz

+0

안녕하세요 Forest, StackOverflow에 오신 것을 환영합니다. 거의 코드를 들여 쓰기가 어렵 기 때문에 코드를 형식화하면 좋을 것입니다. 그 외에도 문제를 좁히고 일반화하려고하십시오. – bitmask

+0

@Shingetsu : 스크롤 휠이 끊어 졌습니까? – bitmask

답변

4

당신은 코드의 각 case: 블록 후 switch(face)에서 break; 문을 누락되었습니다. break; 문이 없으면 코드가 다음 case:에 이르기까지 원하는대로 처리되지 않습니다.

+0

좋아, 이것이 문제였다. 내가 한 모든 것은 휴식 시간을 추가하는 것이었고 모든 것이 내가 원하는 방식으로 100 % 효과를 냈습니다. 고마워. –

3

길 찾기가 잘못되었다고 생각합니다. maze[2][0]에서 '6'을 향해야합니다. maze[2][1]으로 진행하고 '6'을 계속 향하고 싶습니다. 당신이 방향 (6)의 mazeTraversal 코드를 보면, 당신은이 사건을 얻을 :

if(maze[y][x+1] == "."){  
    maze[y][x+1] = "x";  
    face = 8; 
} 

그래서 잘못의 결과 방향을 설정하고 있습니다. 똑바로 유지하는 데 도움이 될
것은 임의의 숫자 코드 대신에 열거를 사용하는 것입니다 : 나는 심지어 나침반 방향에 대해 잊고 문제에 대한 구체적인 방향을 사용할 수 있습니다

enum Facing { 
    face_EAST, 
    face_SOUTH, 
    face_WEST, 
    face_NORTH } face = face_EAST; 

. 코드에서 방향을 바로 잡는 데 도움이됩니다.

enum Facing { 
    face_Xplus, 
    face_Yplus, 
    face_Xminus, 
    face_Yminus } face = face_Xplus; 
+0

고마워. 나는 사실 내 실수를 깨달았다. 나는 처음에는 cartesian 그래프와 같은 미로 배열을 생각했고 미로 포인트는 (x, y)로 생각했다. 나는 미로 배열이 실제로 (y, x)로 저장된다는 것을 알아 냈습니다. 그래서 나는 모든 y를 x와 vice versa로 바꿨지 만, 잊었던 것은 "Y"(데카르트 y에서와 같이)가 내림차순으로 간다는 것입니다. 다시 한번 감사드립니다. –