指针二进制树迷宫解算器在C

时间:2016-10-21 20:19:01

标签: c algorithm binary-tree maze

我需要创建一个用C编程的机器人模拟器。机器人必须使用递归回溯算法找到2d labirinth的出口,我知道这个算法是如何工作的,但我不知道如何实现它。我想我可以使用指针使用二叉树,但我不知道如何做到这一点,你能尝试向我解释一下吗?

这是我创建的程序,现在机器人因为改变方向的方法而进入循环

<div class="image_container">
  <img src="http://dummy-images.com/abstract/dummy-480x270-Bottles.jpg" />
</div>

1 个答案:

答案 0 :(得分:0)

我很难理解二叉树如何在迷宫中寻找路径(也许它曾用于代表迷宫?)但是也许我是盲目的。我只想制作一个2d int数组,让0表示位置被阻挡(那里有一堵墙或其他东西)而1意味着它是开放的(你可以移动到那里)。蛮力回溯程序,正常运动(左,右,上,下)将是:

f(x,y){
    // you found the place your want to go to
    if (x,y) is (destinationX,destinationY) 
        return true

    block the position (x,y) // i.e. mark current position as visited

    if there is an open spot at (x,y-1) AND f(x,y-1)
        return true
    if there is an open spot at (x,y+1) AND f(x,y+1)
        return true
    if there is an open spot at (x-1,y) AND f(x-1,y)
        return true
    if there is an open spot at (x+1,y) AND f(x+1,y)
        return true

    return false
}

假设你的迷宫看起来像:

"+" is where you start ([1][1])
"-" is your destination ([3][1])
"#" is a blocked region

===========
|#|#|#|#|#|
|#|+| |#|#|
|#|#| |#|#|
|#|-| | |#|
|#|#|#|#|#|
===========

使用上述想法我有:

#include <stdio.h>
#define width 5
#define height 5

// print maze
void print(char arr[][width]){
    for (int i = 0; i < 2*width+1; i++) printf("=");
    printf("\n");
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            printf("|%c",arr[i][j]);
        }
        printf("|\n");
    }
    for (int i = 0; i < 2*width+1; i++) printf("=");
}


// starting from (x,y) to (destX,destY)
int path(int arr[][width],int x,int y,int destX,int destY,char toDest[][width]){
    if (x==destX && y==destY) {
        toDest[y][x] = '*';
        print(toDest);
        return 1;
    }
    // mark current position as visited
    arr[y][x] = 0;
    toDest[y][x] = '*';

    // left
    if (arr[y][x-1] && path(arr,x-1,y,destX,destY,toDest))
        return 1;

    // right
    if (arr[y][x+1] && path(arr,x+1,y,destX,destY,toDest))
        return 1;

    // up
    if (arr[y-1][x] && path(arr,x,y-1,destX,destY,toDest))
        return 1;

    // down
    if (arr[y+1][x] && path(arr,x,y+1,destX,destY,toDest))
        return 1;

    return 0;
}


int main () {
    // use this to store path
    // and then print it out if found
    char toDest[height][width] = {
            {'#','#','#','#','#'},
            {'#',' ',' ','#','#'},
            {'#','#',' ','#','#'},
            {'#',' ',' ',' ','#'},
            {'#','#','#','#','#'}
    };

    // 0 -> position is blocked
    // 1 -> position is open
    int maze[height][width] = {
            {0,0,0,0,0},
            {0,1,1,0,0},
            {0,0,1,0,0},
            {0,1,1,1,0},
            {0,0,0,0,0}
    };

    path(maze,1,1,1,3,toDest);
}

输出:

===========
|#|#|#|#|#|
|#|*|*|#|#|
|#|#|*|#|#|
|#|*|*| |#|
|#|#|#|#|#|
===========

在输出中,路径由* s

指定