我一直在尝试使用两个条件对Numbrix生成器进行编程:
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;
}
答案 0 :(得分:-2)
当我做Numbrix时,我注意到这些数字通常是随机的,但是总有一个数字桥接到另一个数字,并且没有阻塞。
你可以在纸上自己写出一个Numbrix,而不是试图在计算机上弄明白。或者,你可以查看Numbrix并写下他们的内容,但根据自己的喜好稍微改一下。希望这有帮助!