【问题标题】:Rotate Matrix and Delete Characters and Find largest Square [closed]旋转矩阵并删除字符并找到最大的正方形[关闭]
【发布时间】:2026-01-09 15:40:02
【问题描述】:

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

一位新手员工使用材料 C 和 D 的砖块制作了一面方形墙。但是,客户要求墙壁仅由优质材料 - 材料 C 制成。

为了解决这个问题,他们会将墙壁放在一个特殊的炉子中并加热,使材料 D 熔化,只剩下材料 C。如果其下方的材料 D 砖熔化,材料 C 砖会因重力而向下移动。新创建的空白空间将被新材料 C 方墙填充。他们还想在建造最后一堵墙时使用尽可能大的 C 方形墙。为此,他们将以最佳方式将炉壁定位在炉中,即如果需要,可任意旋转 90 度,从而为新材料 C 壁创造最大的空间。炉子开始加热时不能旋转。

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

约束 1

输入 第一行将提供原始墙 N 的大小。

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

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

时间限制 1

示例 示例 1

输入

4

C D C D

C C D C

D D D D

C D D D

输出

3

解释

如果墙的左侧位于底部,则可以为新的 2x2 大小的 C 墙创建空间。这可以形象化如下

D C D D

C D D D

D C D D

C C D C

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


  • C - -

C C - -

C C - C

因此,可以更换的最大墙壁尺寸为 2x2。

如果墙按原样放置,其原始底面位于底部,则可以为新的 3x3 大小的 C 墙创建空间。熔化后,可以如下所示进行可视化。


C - - -

C - - -

C C C C

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

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

示例 2

输入

7

C D D C D D D

C D D C D D D

D D D D D D C

D C D C D D D

D D D C D C D

C D D C D C C

C D C D C C C

输出

5

解释

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

D D C D D C C

D D D D C C C

D D D D D D C

C C D C C C D

D D D D D D C

D D D C D D D

C C D D D C C

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



_ _ _ _ _C

_ _ _ _ _ C C

_ _ _ _ _ C C

C C _ C C C C

C C C C C C C

而如果不进行旋转,则D砖熔化后形成的墙如下



_ _ _ C _ _ _

C _ _ 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; 
        } 
    } 
} 

【问题讨论】:

  • 问题是什么?你想让我们为你写一些代码吗? 尝试过什么?
  • @Evg,我编写了旋转代码,但我很困惑如何删除“D”并在此之后获得最大大小的子数组......我知道逻辑但代码实现问题让我感到沮丧跨度>
  • 那我建议你问一个更具体的关于你的实现问题的问题,并展示你到目前为止的一些代码。 How do I ask a good question?
  • 我会首先将逻辑分成不同的类和方法,例如有一个旋转墙壁将其熔化并熔化并施加重力的熔炉类。然后也许是第三类,给你最大的正方形。需要遍历墙的各种旋转并记住可能的最大正方形。
  • 实现融合的一种简单方法是遍历列,将D 替换为0 并使用std::sort 按升序排序。对每一列执行此操作。

标签: c++ arrays algorithm matrix logic


【解决方案1】:

我不知道你到底用的是什么数据结构,但假设它是:

std::vector<std::vector<char>> wall;

为了能够使用std::sort 进行熔解,最好在外部向量中包含列,在内部向量中包含行。

// 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());
}

我没有对此进行测试,因此您可能需要调试。

要找到适合的最大正方形,一种方法是旋转墙壁并在每次旋转时融化,然后搜索最大的正方形,可能使用 while 循环。

此外,将代码组织到类中也很重要,例如墙壁、熔炉等

【讨论】:

  • 在您的代码中更新了轮换代码。
  • 最后一件事,请您将所有代码合并到一个工作中
  • 我在问题本身中给出了轮换代码。
  • 请根据您使用的墙壁结构采用此。我使用std::vector 不知道它实际上是一个数组。但是解决这个问题的基本想法是相同的。 @SarahKaiser
  • 非常感谢@erfan,你帮了很多忙。只需将代码组合起来......将进一步帮助我。
最近更新 更多