检查共享行、列、对角线的最有效方法? 在C++中,如果我有一个正方形数组int板[8 ] [8 ],这样填充: 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0

检查共享行、列、对角线的最有效方法? 在C++中,如果我有一个正方形数组int板[8 ] [8 ],这样填充: 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0,c++,multidimensional-array,C++,Multidimensional Array,检查1是否与另一个1共享行、列或对角线的最短方法是什么 编辑:我说的“最有效”是指“最短”您可以对行、列和对角线使用位掩码,以指示它们中是否有1: int rowMask = 0; int ColumnMask = 0; int diagonalMask0 = 0; int diagonalMask1 = 0; for(int i = 0; i < 8; i++) { for(int j = 0; j < 8; j++) { if(board[i][j

检查1是否与另一个1共享行、列或对角线的最短方法是什么


编辑:我说的“最有效”是指“最短”

您可以对行、列和对角线使用位掩码,以指示它们中是否有1:

int rowMask = 0;
int ColumnMask = 0;
int diagonalMask0 = 0;
int diagonalMask1 = 0;
for(int i = 0; i < 8; i++)
{
    for(int j = 0; j < 8; j++)
    {
        if(board[i][j])
        {
            // test row:
            if(rowMask & (1 << i))
                return true;
            rowMask |= 1 << i; // mark row set

            // test column:
            if(columnMask & (1 << j))
                return true;
            columnMask |= 1 << j; // mark column set

            // test first diagonal:
            if(diagonalMask0 & (1 << (i + j)))
                return true;
            diagonalMask0 |= 1 << (i + j); // mark diagonal set

            // test first diagonal:
            if(diagonalMask1 & (1 << (8 + i - j)))
                return true;
            diagonalMask1 |= 1 << (8 + i - j); // mark diagonal set
        }
    }
}
return false;

如果在特定行中设置了元素,则在rowMask中测试该行的位。如果已经设置,则返回true,否则使用按位或其他元素对其进行测试。柱和对角线也是如此。

8 x 8板?这一定和国际象棋或其他什么有关

这里有一个聪明的方法来测试任何一个棋子是否被女王击中,即几乎等同于一个1是否与另一个1共享一行、一列或对角线

bool CG_queen::move(File f_to, Rank r_to, File f_from, Rank r_from)
{
    bool canMakeMove = false;

    //Check to see if Queen is moving only by File or only by Rank.
    //aka, only vertically or horizontally.
    if ( f_from == f_to || r_from == r_to )
    {
        canMakeMove = true;
    }

    //Check to see if Queen only moves diagonally.
    if ( abs(f_from - f_to) == abs(r_to - r_from) )
    {
        canMakeMove = true;
    }

    return canMakeMove;
}

这很小,只有8乘以8个字段。首先,我会使用最简单的方法,即简单的循环。对于您的用例来说,它很可能足够快。最短的循环检查方法是什么?我是编程新手,我会先做多个循环,然后检查行,然后检查列,然后检查对角线,我还没有完全弄清楚它们的计数。有没有更简单的方法?不管是什么方式,它与C++无关。如果您真的想问一个特定于此语言或任何其他语言的问题,那么最好将您的代码与此一起发布,并参考此代码中的特定问题。否则,它会让人觉得您在要求其他人为您实现一个解决方案。如果同一行/列/对角线上存在另一个1,您只需要返回true,还是还需要返回索引?最快的解决方案是不使用8x8数组。使用int64\t。然后,您可以构造一个包含64个元素的int64_t表,每个位置一个,在对应于相应行、列和对角线的位置上有1个。检查一个1是否与其他1共享一行、一列或一个diag只是与正确的表元素:64位处理器上的1指令进行anding。是的,我正在尝试查看一个有1-8个皇后的板是否位于没有皇后相互威胁的位置。那么,上面的代码是gold。它已经在我的Android/iOS国际象棋应用程序中进行了数千次测试,如果你愿意,我可以在GitHub上为你发送一个指向公共存储库的链接。顺便说一句,你正试图在rosetta code上编写的程序有一个更丑陋的实现。我没意识到你不能在这里发送。无论如何,这是链接。关于这个项目的任何问题,请告诉我。项目已经完成,但是文档,尤其是我刚开始记录项目的网站和糟糕的自述文件需要大量更新。谢谢,这绝对是我最容易理解的解决方案,但我觉得很公平,因为我说我应该把它给你MrPickles@AustinMW非常感谢你。我上面的代码实际上并不难理解,如果你在纸上写出来的话。我假设测试对角线的代码很难理解,但它确实是一个使用向量加法和减法的巧妙数学技巧。取棋盘上的任意方块,比如说左上角0,0和右下角7,7。减去两个,取绝对值,得到7==7…这是真的,因为左上角和右下角在同一对角线上。