旋转矩阵并删除字符并找到最大的正方形

Rotate Matrix and Delete Characters and Find largest Square

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

新手用 material C 和 D 的砖砌了一面方墙。但是,客户要求只用优质 material - material C.

为了解决这个问题,他们将把墙放在一个特殊的炉子里加热,这样 material D 就会熔化,只剩下 material C。 Material 如果下面的 material D 砖熔化,C 砖将由于重力向下移动。创建的新空 space 将由新的 material C 方形墙填充。他们还想在建造最后一面墙时使用尽可能大的 C 方形墙。为此,他们将以最佳方式将墙放置在炉子中,即如果需要,可以任意次数地旋转 90 度,以便创建最大的 space 新 material C 墙。炉子开始加热时不能旋转。

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

约束条件 1 < N < 100

输入 第一行会提供原墙的尺寸N.

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

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

时间限制 1

例子 示例 1

输入

4

C D C D

C C D C

D D D D

C D D D

输出

3

说明

如果墙的左侧在底部放置,space 可以创建大小为 2x2 的新 C 墙。这可以可视化如下

D C D D

C D D D

D C D D

C C D C

熔化的砖块可视化如下


C C - -

C C - C

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

如果墙按原样放置,其原始底面在底部,space 可以创建大小为 3x3 的新 C 墙。 Post 熔化,这可以形象化如下。


C - - -

C - - -

C C C C

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

因为没有旋转后加热会产生大于 3x3 的 space,输出为 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

说明

如果墙的左侧位于底部,则可以创建一个 space 大小为 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 砖熔化后 space 会创建一个尺寸为 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

当墙的这个方向被加热时,space 尺寸为 3x3 的新 C 墙仅在 D 砖熔化后创建

因此旋转很重要,正确答案是 5x5

因为没有旋转后加热会产生大于 5x5 的 space,输出为 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; 
        } 
    } 
} 

我不确切知道你把墙放在什么数据结构中,但假设它是:

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 循环。

此外,将您的代码组织成 类 也很重要,例如墙壁、火炉等