C++ 旋转矩阵并删除字符,然后找到最大的正方形

C++ 旋转矩阵并删除字符,然后找到最大的正方形,c++,arrays,algorithm,matrix,logic,C++,Arrays,Algorithm,Matrix,Logic,一家公司生产可直接植入现场的墙壁。该公司使用材料C和材料D的小方砖,它们外观相似,但质量差异巨大。该公司制造方形墙壁只是为了优化成本 一名新员工用C和D材质的砖块制作了一堵方形墙。然而,客户要求这堵墙只使用高质量的材料——C材质 为了解决这个问题,他们将把炉壁放在一个特殊的熔炉中加热,使材料D熔化,只剩下材料C。如果下面的材料D砖熔化,材料C砖将由于重力向下移动。创建的新空白空间将由新材质C方形墙填充。他们还希望在建造最后一面墙时使用尽可能大的C方形墙。为此,他们将以最佳方式将炉壁放置在炉内,如

一家公司生产可直接植入现场的墙壁。该公司使用材料C和材料D的小方砖,它们外观相似,但质量差异巨大。该公司制造方形墙壁只是为了优化成本

一名新员工用C和D材质的砖块制作了一堵方形墙。然而,客户要求这堵墙只使用高质量的材料——C材质

为了解决这个问题,他们将把炉壁放在一个特殊的熔炉中加热,使材料D熔化,只剩下材料C。如果下面的材料D砖熔化,材料C砖将由于重力向下移动。创建的新空白空间将由新材质C方形墙填充。他们还希望在建造最后一面墙时使用尽可能大的C方形墙。为此,他们将以最佳方式将炉壁放置在炉内,如有需要,可旋转90度任意次数,以便为新材料C炉壁创造最大的空间。当熔炉开始加热时,不可能旋转

考虑到新员工创建的原始墙的结构,您需要找出新的C方形墙的尺寸,该尺寸可以安装在将交付给客户的最终墙中

约束条件 1 输入 第一行将提供原始墙的尺寸N

接下来的N行将提供新手员工用于每个砖块的材料类型(C和D)

输出 可安装在最终墙体中的最大可能的C方形墙体的尺寸

时限 一,

例子 例1

输入

四,

C-D-C-D

C C D C

D

C-D-D

输出

三,

解释

如果墙的左侧位于底部,则可以为尺寸为2x2的新C墙创建空间。这可以可视化如下

D C D

C-D-D

D C D

C C D C

熔化的砖块可以可视化如下


  • C--
C--

C-C

因此,可替换的最大墙尺寸为2x2

如果墙按原样放置,其原始底面位于底部,则可以为尺寸为3x3的新C墙创建空间。熔化后,这可以可视化如下


C----

C----

C C C C C

因此,在这种方法中,可替换的最大墙尺寸为3x3

由于加热后的旋转不会产生大于3x3的空间,因此输出为3

例2

输入

七,

C-D-D-D-D

C-D-D-D-D

D D D C

D-C-D-D

D D D C D C D

点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴

点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴点滴

输出

五,

解释

如果墙的左侧位于底部,则可以为尺寸为5x5的新C墙创建空间。这可以可视化如下

D D C D C C

D D D C C

D D D C

C C D C C D

D D D C

D D D D D D D D

C C D D C

当墙的这个方向被加热时,在D砖熔化后,将为尺寸为5x5的新C墙创建一个空间



__uuuuc

__uuc_uc

__uuc_uc

C C C C

C C C C C C C C

然而,如果未进行旋转,则D砖熔化后形成的墙如下所示



__uu_uu_uu_uu_

C_

C C C

C C C

C C C C C C C C

当墙的这个方向被加热时,只有在D砖熔化后,才会为尺寸为3x3的新C墙创建空间

因此,旋转非常重要,正确答案为5x5

由于加热后的旋转不会产生大于5x5的空间,因此输出为5

// matrix rotation by 90 degrees
void rotate90Clockwise(int a[N][N]) 
{ 
  
    // Traverse each cycle 
    for (int i = 0; i < N / 2; i++) { 
        for (int j = i; j < N - i - 1; j++) { 
  
            // Swap elements of each cycle 
            // in clockwise direction 
            int temp = a[i][j]; 
            a[i][j] = a[N - 1 - j][i]; 
            a[N - 1 - j][i] = a[N - 1 - i][N - 1 - j]; 
            a[N - 1 - i][N - 1 - j] = a[j][N - 1 - i]; 
            a[j][N - 1 - i] = temp; 
        } 
    } 
} 
//矩阵旋转90度
空旋转90顺时针(整数a[N][N])
{ 
//遍历每个循环
对于(inti=0;i
我不知道墙的确切数据结构,但假设它是:

std::vector<std::vector<char>> wall;
我还没有测试这个,所以你可能需要调试

要找到要装入的最大正方形,一种方法是旋转墙并在每次旋转时熔化,然后搜索最大正方形,也许可以使用while循环


此外,将代码组织成类(如Wall、Furne等)也很重要。

问题是什么?你想让我们为你写些代码吗?你试过什么?@Evg,我写了旋转的代码,但我不知道如何删除'D'“然后得到最大大小的子阵列。。。我知道逻辑,但代码实现问题让我很沮丧。我建议你问一个关于实现问题的更具体的问题,并展示一些到目前为止的代码。首先,我会将逻辑划分为不同的类和方法,例如,让一个旋转墙壁的类将其发送到熔炉类,熔炉类熔化并应用重力。然后可能是第三类,让你最大的广场适合。需要迭代墙的各种旋转并记住可能的最大正方形。实现熔化的一个简单方法是迭代列,将
D
替换为
0
,并使用
std::sort
按升序排序。对每一列都这样做。在你的代码中更新了轮换代码。最后一件事,你能把所有代码合并成一个工作代码吗?我在问题本身中给出了轮换代码。请将此作为p
// melting bricks
for (int col = 0; col < wall.size(); ++col) //column of bricks
{
    for (int row = 0; row < wall[0].size(); ++row) //row of bricks
    {
        if (wall[col][row] == 'D') wall[col][row] = 0;
    }
}

// applying gravity i.e. sorting
for (int col = 0; col < wall.size(); ++col) //column of bricks
{
    std::sort(wall[column].begin(), wall[column].end());
}