网格中的所有可能组合

时间:2014-05-15 19:40:40

标签: algorithm math c++11 combinations

好的,这一直困扰着我一段时间,我只是碰壁了。所以说你有一个方形网格表示为二维数组,每个单元格可以处于两种状态之一。你将如何建立一个可能存在于所述网格中的每种可能组合的列表?我意识到这对于较大的网格来说是不切实际的,但对于像5x5或更小的小的东西我想象可以简单地列举每个可能的组合。

同样为了记录我正试图解决nurikabe难题并找到所有可能的配置。我还有其他一些东西需要修剪,但是建立原始的可能配置列表会让我感到害怕

2 个答案:

答案 0 :(得分:0)

您可以将其视为一个n * n二进制数,其中n是方形网格边的大小。此时,您所要做的就是以二进制数从000 ... 0(n个零)到111 ... 1(n个)计数并保存每个数字。然后,如果您希望通过运行二进制数并且每n个位转到数组中的下一行,就可以将其转换为数组格式。

答案 1 :(得分:0)

对于5x5平方,有2 ^ 25种可能的组合。

因此,您可以使用32位整数来表示一个。


这是一个将整数转换为正方形的函数:

void Id2Square(const unsigned int& id,bool square[SIZE][SIZE])
{
    for (int n=0; n<SIZE*SIZE; n++)
        square[n/SIZE][n%SIZE] = (bool)((id>>n)&1);
}

这是一个将方块转换为整数的函数:

void Square2Id(unsigned int& id,const bool square[SIZE][SIZE])
{
    id = 0;
    for (int n=0; n<SIZE*SIZE; n++)
        id |= (unsigned int)square[n/SIZE][n%SIZE]<<n;
}

因此,如果您想检查所有可能的方块,那么您可以按如下方式进行:

void CheckAllSquares()
{
    bool square[SIZE][SIZE];
    for (int id=0; id < 1<<(SIZE*SIZE); id++)
    {
        Id2Square(id,square);
        // Now do whatever you want to do with 'square'
    }
}