繁体   English   中英

迷宫求解器的递归最佳路径长度计算-错误

[英]Recursive best way length calculation for maze solver - error

我正在尝试确定迷宫(三维迷宫)的快速路径的长度,因此,长度较短的迷宫。 我已经完成了休闲代码(u是可以上升的点,da是可以下降的点):

typedef struct _parking {
int depth;
int width;
int height;
int entrances;
int exits;
int park_slots;
int available_park_slots;
local *** floors;

}parking;
typedef struct _local {
char type;
    char name[5];
int percorrido;
}local;

int bestlength = 99999999;

int DFS_ponto_carro(parking * parklot, int x, int y, int z, int a, int b, int c, int percorridos){
(parklot->floors[x][y][z]).percorrido = 1;
if(percorridos >= bestlength){
    return 30;
}
if ((x+1)==a && y==b && z==c){
    printf("cheguei aqui 1\n");
    bestlength = percorridos;
    return 30;
}
if ((x-1)==a && y==b && z==c){
    printf("cheguei aqui 2\n");
    bestlength = percorridos;
    return 30;
}
if (x==a && (y+1)==b && z==c){
    printf("cheguei aqui 3\n");
    bestlength = percorridos;
    return 30;
}
if (x==a && (y-1)==b && z==c){
    printf("cheguei aqui 4\n");
    bestlength = percorridos;
    return 30;
}
if(x != parklot->width-1){
    if((parklot->floors[x+1][y][z]).type == ' ' && (parklot->floors[x+1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x+1, y, z, a, b, c, percorridos++);
    }
    if((parklot->floors[x+1][y][z]).type == 'u' && (parklot->floors[x+1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x+1, y, z+1, a, b, c, percorridos++);

    }
    if((parklot->floors[x+1][y][z]).type == 'd' && (parklot->floors[x+1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x+1, y, z-1, a, b, c, percorridos++);
    }
}
if(y != 0){
    if((parklot->floors[x][y-1][z]).type == ' ' && (parklot->floors[x][y-1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y-1, z, a, b, c, percorridos++);
    }
    if((parklot->floors[x][y-1][z]).type == 'u' && (parklot->floors[x][y-1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y-1, z+1, a, b, c, percorridos++);
    }
    if((parklot->floors[x][y-1][z]).type == 'd' && (parklot->floors[x][y-1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y-1, z-1, a, b, c, percorridos++);
    }
}
if(x != 0){
    if((parklot->floors[x-1][y][z]).type == ' ' && (parklot->floors[x-1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x-1, y, z, a, b, c, percorridos++);
    }
    if((parklot->floors[x-1][y][z]).type == 'u' && (parklot->floors[x-1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x-1, y, z+1, a, b, c, percorridos++);
    }
    if((parklot->floors[x-1][y][z]).type == 'd' && (parklot->floors[x-1][y][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x-1, y, z-1, a, b, c, percorridos++);
    }
}
if(y != parklot->height-1){
    if((parklot->floors[x][y+1][z]).type == ' ' && (parklot->floors[x][y+1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y+1, z, a, b, c, percorridos++);
    }
    if((parklot->floors[x][y+1][z]).type == 'u' && (parklot->floors[x][y+1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y+1, z+1, a, b, c, percorridos++);
    }
    if((parklot->floors[x][y+1][z]).type == 'd' && (parklot->floors[x][y+1][z]).percorrido == -1){
        DFS_ponto_carro(parklot, x, y+1, z-1, a, b, c, percorridos++);
    }
}
return 0;
}

该代码使我在最后一次返回时出现了段错误,但我似乎无法找出原因,有人可以帮助我吗?

您递归调用DFS_ponto_carro ,其中z值可能超出范围:即z-1z+1 在递归调用中要做的第一件事是取消引用parklot->floors[x][y][z] 如何确保z保持在数组边界之内?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM