在棋盘上寻找可被车攻击的方块

Finding Squares on the chessboard attackable by a rook

问题是这样的..

有一个NxN的棋盘。棋盘上的每个方格可以是空的,也可以有车。我们所知道的车可以水平或垂直攻击。给定一个 2D 矩阵,其中 0 代表一个空方格,1 代表一个车,我们必须用 1 填充矩阵中的所有单元格,1 代表可以被棋盘上存在的任何车攻击的方格。

现在,我可以在 O(n^3) 时间和常量 space 复杂度内轻松完成此操作。然后在 O(n^2) 时间和 O(2*n) space 复杂度。但我需要在 O(n^2) 时间和常数 space 中找出一个解决方案。有人请帮忙。

试试这个解决方案

int main(){
    int n;
    int chess[64][64];
    int hor[64],ver[64];
    //read chessboard
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            if(chess[i][j] == 1){
                hor[i] = 1;
                ver[j] = 1;
            }
    int cntHor=0;
    int cntVer=0;
    for(int i=0; i<n; i++){
        if(hor[i] == 1) cntHor++;
        if(ver[i] == 1) cntVer++;
    }
    int result = (cntHor+cntVer)*n-cntHor*cntVer;
    cout<<result;
    return 0
}

假设您知道所有的车都在第一列或第一行。然后你会得到一个没有 space 开销的 O(n^2) 解决方案,只需遍历第一个 row/column 并在每次看到车时填充你的矩阵(除了填充第一行/第一列,你在最后一步处理)。 如果所有的车都在最后一列/最后一行,第一列/最后一行,最后一列/第一行,这同样适用。

现在获取初始矩阵并对其进行迭代,直到它包含一个车。设 i 是该车所在行的索引,j 是其列的索引。继续遍历矩阵,对于您在位置 (i',j') 找到的每个车,将其移除并用位置 (i,j') 的车和位置 (i',j) 的另一个车替换它。

您最终得到的矩阵将只在第 i 行和第 j 列有一个。设 A_1 为 A 的第 i 行组成的子矩阵,并且 j 第一列。然后 A_1 有 属性 它只包含一个 最后一行/las 列,因此您可以在没有 space 开销的情况下求解 A_1。对 A 的其他三个子矩阵(具有 n-i+1 最后一行和 j 第一列的子矩阵,依此类推)执行相同的操作。

如果不清楚请告诉我,我会提供更多细节。