2

我想知道是否有人可以向我解释以下代码块中发生了什么。该代码用于在 7 个房间之间创建随机连接,确保每个房间至少有 3 个连接。

void bitcodeToEdge(int bitcode, int *edge)
{
    int i = 0; 
    int j = 0; 
    while (i < 2 && bitcode > 0) {
        if (bitcode % 2 == 1) {
            edge[i] = j;
            i++;
        }
        bitcode >>= 1;
        j++;
    }
    for (; i < 2; ++i) edge[i] = -1;
}

void edgeToBitcode(int *edge, int *bitcode)
{
    *bitcode = power(2, edge[0]) + power(2, edge[1]);
}

void connectRooms(int *rooms, char *dir, char **filenames, char **roomNames)
{
    int i, j;
    FILE *file;
    char filename[100]; 
    int bitcode; 
    int edge[2]; 
    int *edges; 
    int edgeIdx;
    int maxEdges;
    int minEdges; 
    int randEdges; 
    int valencies[10]; 
    maxEdges = 21;
    edgeIdx = 0;
    edges = malloc(sizeof(int) * maxEdges);
    assert(edges != NULL);
    for (i = 0; i < 10; ++i) {
        for (j = i + 1; j < 10; ++j) {
            edge[0] = rooms[i];
            edge[1] = rooms[j];
            edgeToBitcode(edge, &bitcode);
            edges[edgeIdx] = bitcode;
            edgeIdx++;
        }
    }
    permute(edges, maxEdges);
    for (i = 0; i < 10; ++i) valencies[i] = INT_MAX;
    for (i = 0; i < 7; ++i) valencies[rooms[i]] = 0;
    edgeIdx = 0;
    minEdges = 10;
    randEdges =  getRandInt(minEdges, maxEdges);
    while (edgeIdx < randEdges || getIntArrayMin(valencies, 7) < 3)
    {
        bitcodeToEdge(edges[edgeIdx], edge);
        valencies[edge[0]] += 1;
        valencies[edge[1]] += 1;
        for (i = 0; i < 2; ++i) {
            strcpy(filename, dir);
            strcat(filename, filenames[edge[i]]);
            if ((file = fopen(filename, "a")) == NULL) {
                fprintf(stderr, "could not open %s for writing\n", filename);
                exit(2);
            }
            fprintf(file, "\nCONNECTION %d: %s",
            valencies[edge[i]],
            roomNames[edge[1 - i]]);
            fclose(file);
        }
        edgeIdx++;
    }
    free(edges);
}

Power 就像 pow 一样工作 - x^y
GetIntArrayMin获取数组中的最小整数值
Permute 创建指定整数数组的伪随机排列。

我根本不明白比特码是什么。也许如果有人能解释一下,一开始我就能理解其余的部分。谢谢!

4

3 回答 3

0

Bitcode 是一个 int 和一个方便的随机数据存储。在第一个函数中,它只是一个布尔数组。int由以下代码处理

if( bitcode % 2 == 1) 
...
Bitcode >>=1

如果使用了 &(不要与 && 混淆)会更清楚。

if(bitcode & 1)
于 2015-05-01T08:35:01.930 回答
0

位码是边缘的简短表示。它始终包含设置为 1 的两个位。当这两个位设置在位置 N,M 上时,表示 N,M 之间存在连接。

还有一些关于位编码边缘的陈述:

  • (bitcode1 & bitcode2) != 0 表示对应的边属于一个房间
  • 位码不是定向的,这意味着不可能有单向连接(如果 N 连接到 M,则 M 连接到 N)
于 2015-05-01T08:35:21.400 回答
0

看起来它只是一个二进制布尔值字符串。在第一个函数中一次处理一点。组合

if( bitcode % 2 == 1)

...

bitcode >>= 1

达到这一点。

于 2015-05-01T08:16:00.813 回答