创建一组随机连接的节点

Create a randomly connected set of nodes?

本文关键字:随机 连接 节点 一组 创建      更新时间:2023-10-16

我正在尝试编写一个函数,generate_labyrinth(),创建固定数量的随机连接的节点。每个节点与其他三个节点连接。

这是我现在拥有的:

labyrinth.h

#ifndef LABYRINTH_H
#define LABYRINTH_H     
// node
class Room {
public:
    Room () 
        : room_number(0), left_door(nullptr),
        center_door(nullptr), right_door(nullptr) { }
    // data member
    int room_number;
    // pointers to other nodes
    Room* left_door;
    Room* center_door;
    Room* right_door;
};
//================================================= 
class Labyrinth {
public:
    Labyrinth (int s) : size(s) { generate_labyrinth (); }
private:
    // number of nodes
    int size;
    // root node
    Room* entrance;
    // Helper functions
    int random_number (int from, int to);
    int random_number_without_i (int min, int max, int i);
    // Initialiazation function
    void generate_labyrinth ();
};
#include "labyrinth.cpp"
#endif

labyrinth.cpp

// Class Labyrinth member implementations
int Labyrinth::random_number (int min, int max) {
    static bool seed_initialized = false;
    if (!seed_initialized) {
        seed_initialized = true;
        srand((unsigned int) time(NULL));
    }
    return rand() % (max - min + 1) + min; 
}
int Labyrinth::random_number_without_i (int min, int max, int i) {
    int res = random_number(min, max);
    while (res == i){
        res = random_number(min, max);
    }
    return res;
}
void Labyrinth::generate_labyrinth () {
    // create "size" number of nodes
    entrance = new Room[size];    
    // initialize Room (node) data members
    for (auto i = 0; i < size; ++i) {
        entrance[i].room_number = i;
    }
    // connect each room with three others
    int first_room = 1;  
    int last_room = size - 1;
    for (int i = 1; i < size; ++i) {
        // avoid connecting a room with itself            
        int left_goes_to = random_number_without_i (first_room, last_room, i);
        int center_goes_to = random_number_without_i (first_room, last_room, i);
        int right_goes_to = random_number_without_i (first_room, last_room, i);
        entrance[i].left_door = (&entrance[left_goes_to]);
        entrance[i].center_door = (&entrance [center_goes_to]);
        entrance[i].right_door = (&entrance [right_goes_to]);;
    }
    // TEST IF NODES POINT TO EACH OTHER
    for (auto i = 0; i < size; ++i) {
        if (entrance[i].left_door == nullptr || entrance[i].center_door == nullptr ||
            entrance[i].right_door == nullptr) {
            std::cout <<"Uninitialized pointer valuen";
        }
    }
    getchar();
}

main

#include <iostream>
#include <time.h>
#include "labyrinth.h"
//=================================================  
int main()
{
    int cave_size = 20;
    Labyrinth cave(cave_size);
}

看起来在节点初始化后generate_labyrinth ()三个指针,left_roomcenter_roomright_room仍然未初始化,即我得到的输出是:

Uninitialized pointer value

问题:

为什么节点中的指针没有初始化?

有没有另一种方法可以生成一组随机连接的节点?


注意:我没有使用insert()函数,因为在构建数据结构期间节点数是固定和确定的。

生成first_roomlast_room的连接,这些连接是1size-1的房间。

// connect each room with three others
int first_room = 1;  
int last_room = size - 1;
for (int i = 1; i < size; ++i) {

但是当你检查连接时,你从房间0开始(可能应该是入口本身)。

// TEST IF NODES POINT TO EACH OTHER
for (auto i = 0; i < size; ++i) {