Numbrix生成器算法

时间:2016-04-13 18:36:47

标签: algorithm

我一直在尝试使用两个条件对Numbrix生成器进行编程:

  • 方格10 x 10
  • 数字1位于网格的底行,100位于顶行

Numbrix的规则是每个数字必须与下面的数字有一个共同的边(在网格中)。

我一直试图制作一个能够生成满足我所说的随机网格的算法,而我却无法做到这一点。我的主要尝试是简单地继续尝试一条路径,在需要的时候返回,直到我最终得到一条在顶行上完成100的路径,但这似乎效率太低。

我希望在这里找到关于如何构建这种算法的指南。

我一直试图在C ++中这样做,但由于这里的主要问题是算法,语言不应成为问题。

这是我现在的算法:

int nrow = 10;
int ncol = 10;

typedef vector< vector<int> > matrix;

bool generate_path(int x, int y, matrix &grid, int value, int maxused)
{
    if(x == 0) maxused++;
    if(maxused == ncol && value != nrow*ncol) return(false);
    grid[x][y] = value;
    if(grid[x][y] == nrow * ncol)
    {
        if(x == 0) return(true);
        grid[x][y] = 0;
        return(false);
    }
    // 0: North, 1: East, 2: South, 3: West
    bool directions[4];
    directions[0] = y+1 < ncol && grid[x][y+1] == 0;
    directions[1] = x+1 < nrow && grid[x+1][y] == 0;
    directions[2] = y > 0      && grid[x][y-1] == 0;
    directions[3] = x > 0      && grid[x-1][y] == 0;
    while(directions[0] || directions[1] || directions[2] || directions[3])
    {
        int direction = rand() % 4;
        while(!directions[direction]) direction = rand() % 4;
        switch(direction)
        {
            case 0:
                if(generate_path(x, y+1, grid, value+1, maxused)) return(true);
                directions[direction] = false;
                break;
            case 1:
                if(generate_path(x+1, y, grid, value+1, maxused)) return(true);
                directions[direction] = false;
                break;
            case 2:
                if(generate_path(x, y-1, grid, value+1, maxused)) return(true);
                directions[direction] = false;
                break;
            case 3:
                if(generate_path(x-1, y, grid, value+1, maxused)) return(true);
                directions[direction] = false;
                break;
        }
    }
    grid[x][y] = 0;
    return(false);
}

matrix generate_grid(const int &mult)
{
    matrix grid(nrow, vector<int> (ncol, 0));
    int x = nrow-1;
    int y = rand() % ncol;
    generate_path(x, y, grid, 1, 0);
    for(int i = 0; i < nrow; i++) for(int j = 0; j < ncol; j++) grid[i][j] = grid[i][j] * mult;
    return grid;
}

1 个答案:

答案 0 :(得分:-2)

当我做Numbrix时,我注意到这些数字通常是随机的,但是总有一个数字桥接到另一个数字,并且没有阻塞。

你可以在纸上自己写出一个Numbrix,而不是试图在计算机上弄明白。或者,你可以查看Numbrix并写下他们的内容,但根据自己的喜好稍微改一下。希望这有帮助!