algoalgo-world
algoalgo-world/maze/binary-tree
maze/binary-tree

二叉树迷宫

选一种语言就能看到代码

def binary_tree_maze(w, h, rng):
    links = [0] * (w * h)
    for room in range(w * h):
        dirs = [d for d in (0, 1) if neighbor(room, d) >= 0]
        if not dirs:
            continue
        d = rng.choice(dirs)
        carve(links, room, neighbor(room, d), d)
    return links
function binaryTreeMaze(w, h, rng) {
  const links = new Array(w * h).fill(0);
  for (let room = 0; room < w * h; room++) {
    const dirs = [];
    if (neighbor(room, 0) >= 0) dirs.push(0);
    if (neighbor(room, 1) >= 0) dirs.push(1);
    if (dirs.length === 0) continue;
    const d = dirs[rng.below(dirs.length)];
    carve(links, room, neighbor(room, d), d);
  }
  return links;
}
void binary_tree_maze(int links[], int w, int h) {
    for (int room = 0; room < w * h; room++) {
        int dirs[2];
        int count = 0;
        if (neighbor(room, 0) >= 0) dirs[count++] = 0;
        if (neighbor(room, 1) >= 0) dirs[count++] = 1;
        if (count == 0) continue;
        int d = dirs[rand() % count];
        carve(links, room, neighbor(room, d), d);
    }
}
void binary_tree_maze(std::vector<int>& links, int w, int h,
                      std::mt19937& rng) {
    for (int room = 0; room < w * h; room++) {
        std::vector<int> dirs;
        for (int d : {0, 1}) {
            if (neighbor(room, d) >= 0) dirs.push_back(d);
        }
        if (dirs.empty()) continue;
        std::uniform_int_distribution<size_t> pick(0, dirs.size() - 1);
        int d = dirs[pick(rng)];
        carve(links, room, neighbor(room, d), d);
    }
}
static int[] BinaryTreeMaze(int w, int h, Random rng) {
    int[] links = new int[w * h];
    for (int room = 0; room < w * h; room++) {
        var dirs = new List<int>();
        foreach (int d in new[] { 0, 1 }) {
            if (Neighbor(room, d) >= 0) dirs.Add(d);
        }
        if (dirs.Count == 0) continue;
        int dir = dirs[rng.Next(dirs.Count)];
        Carve(links, room, Neighbor(room, dir), dir);
    }
    return links;
}
static int[] binaryTreeMaze(int w, int h, Random rng) {
    int[] links = new int[w * h];
    for (int room = 0; room < w * h; room++) {
        List<Integer> dirs = new ArrayList<>();
        for (int d : new int[] {0, 1}) {
            if (neighbor(room, d) >= 0) dirs.add(d);
        }
        if (dirs.isEmpty()) continue;
        int dir = dirs.get(rng.nextInt(dirs.size()));
        carve(links, room, neighbor(room, dir), dir);
    }
    return links;
}
先跑一遍,再读源码