在棋盘上找到可被车辆攻击的正方形

时间:2015-04-01 09:44:54

标签: algorithm data-structures chess

问题是这样的..

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

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

2 个答案:

答案 0 :(得分:1)

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

现在拿出你的初始矩阵并迭代它直到它包含一个车。让我成为这个车的行的索引,j是其列的索引。继续迭代矩阵,并找到你在位置找到的每一辆车(i',j'),将其替换为位置(i,j')的另一辆车和位置上的另一辆车(i') #39;,j)的

你最终得到的矩阵只有第i行和第j列。设A_1是由其第一行和第一行形成的A的子矩阵 j第一列。然后A_1具有仅包含其上的属性 最后一行/ las列,因此您可以在没有空间开销的情况下解决A_1。对A的其他三个子矩阵(具有n-i + 1个最后一行和j个第一个colummns的那个)执行相同的操作,依此类推。

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

答案 1 :(得分:0)

试试这个解决方案

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
}