2017-10-18 15 views
2

Je suis novice en C et j'essaie de faire un problème de labyrinthe où 0 et les lettres sont des points de passage et 1 est une barrière. Mon tableau de labyrinthe 2D est ci-dessous où le point de départ est à (0,4) et chaque fois que je dois vérifier 4 directions (N, S, E, W), et j'ai aussi le tableau de chemin (contient initialement « 0 » en tant que caractères) où je vais mettre les routes comme « R », qui est également la même taille:C Erreur de segmentation de la récursion

1111S11110  
0000010001 
110100010d 
t001111110 
0100000001 
0111111101 
1111111101 
00000D01T1 
0111110001 
0000E01110 

J'utilise une solution récursif pour pathfinding et de l'utilisation totale de 3 fonctions qui sont ci-dessous:

int isSafe(char Mazearray[matrixSize][matrixSize],int x,int y){ 
    if(x >= 0 && x < matrixSize && y >= 0 && y < matrixSize && Mazearray[x][y] != '1'){ 
     return 1; 
    } 
    return 0; 


} 

void MazeSolution(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){ 
    if(recursiveMaze(Mazearray,x,y,pathArray) == 0){ 
     printf("There does not exist a possible solution!!!"); 
    } 
    else{ 
     int i,j; 
     for (i = 0; i < matrixSize; ++i){ 
      for (j = 0; j < matrixSize; ++j){ 
       printf("%c",pathArray[i][j]); 
      } 
     printf("\n"); 
     } 
    } 
} 

int recursiveMaze(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize]){ 
    if(x == exitX && y == exitY){ 
     pathArray[x][y] == 'E'; 
     return 1; 
    } 
    // check if the coordinate is safe to go(not 1) 
    if(isSafe(Mazearray,x,y) == 1){ 
     pathArray[x][y] == 'R'; 
     // Move North 
     if(recursiveMaze(Mazearray,x-1,y,pathArray) == 1){ 
      return 1; 
     } 
     // Move South 
     if(recursiveMaze(Mazearray,x+1,y,pathArray) == 1){ 
      return 1; 
     } 
     // Move East 
     if(recursiveMaze(Mazearray,x,y+1,pathArray) == 1){ 
      return 1; 
     } 
     // Move West 
     if(recursiveMaze(Mazearray,x-1,y-1,pathArray) == 1){ 
      return 1; 
     } 
     pathArray[x][y] == '0'; 
     return 0; 
    } 
    return 0; 
} 

Lorsque j'exécute le MazeSolution(), le programme se termine avec le code d'erreur 255 et segmentati sur défaut.Lorsque j'ai débogué le problème apparaît à recursiveMaze() fonction. Donc, à partir de la première déclaration if, il ne s'exécute pas et l'autre problème est qu'il va et vient entre les points de contrôle sud et nord. Veuillez m'aider à ne pas trouver l'erreur pendant des heures.

Merci d'avance.

+1

compile avec -g et s'exécute sous gdb (asumming sur linux). Cela montrera au moins la ligne défaillante – pm100

+5

Votre "ouest" est faux. Cela devrait être strictement ajusté sur l'axe des y; pas x. 'x-1, y-1' est effectivement un mouvement diagonal. Indépendamment, incluez votre code qui construit vos matrices; efficacement un exemple minimum ** complet ** qui démontre votre problème. La lecture de ce code est inutile si vous avez écrasé le code qui charge les tableaux et/ou amorce les quatre variables globales que vous utilisez apparemment. – WhozCraig

+1

Etes-vous sûr que vous avez besoin du tout dernier retour 0 .... Pourrait-il être le retour 1 peut-être? (Comme rien ne se passe donc tout est bon?) – Grantly

Répondre

2

Voici une séquence d'appel qui conduit à une boucle infinie:

recursiveMaze(M, x, y, p) 
    recursiveMaze(M, x-1, y, p) 
     recursiveMaze(M, x-1, y, p) -> run to completion 
     recursiveMaze(M, x+1, y, p) -> infinite loop 

Il est infini parce que dans le second appel récursif, vous incrémenter la valeur de retour qui avait été décrémenté dans le premier appel récursif, qui prend vous revenez au même état que l'appel initial.