动态编程:寻找最大的钻石(菱形)

时间:2010-04-09 13:49:12

标签: java

我有一个用Java做的小程序。我有一个填充0和1的2D数组,我必须找到最大的菱形(如旋转45度的方形)和它们的数字。

示例:

0 1 0 0 0 1

1 0 1 1 1 0

1 0 1 1 1 1

0 1 1 1 1 1

0 0 1 1 1 1

1 1 1 1 1 1

结果:

      1    

    1 1 1  

  1 1 1 1 1

    1 1 1  

      1    

问题类似于this SO question

如果您有任何想法,请在此处发布。

3 个答案:

答案 0 :(得分:3)

评论太长了。如果你不能解决它,我会在以后发布我的解决方案,但这是我如何做到的(少于15行代码):我首先创建了第二个数组(稍大一点[n + 2] [ n + 2])并且没有通过n / 2:

0 0 0 0 0 0 0 0 
0 0 1 0 0 0 1 0 
0 1 0 1 1 1 0 0 
0 1 0 1 2 2 1 0 
0 0 1 2 2 2 1 0 
0 0 0 1 2 2 1 0 
0 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 
0 0 1 0 0 0 1 0 
0 1 0 1 1 1 0 0 
0 1 0 1 2 2 1 0 
0 0 1 2 3 2 1 0 
0 0 0 1 2 2 1 0 
0 1 1 1 1 1 1 0 
0 0 0 0 0 0 0 0

其中非零数字x表示“我是大小为x的菱形的中心”(我表示的大小与对角线的长度相关[在你的情况下两者都相等]菱形)。你可以通过检查{top,right,down,left}是否都是大小为k的菱形中心来找到大小为(k + 1)的菱形中心。

首先创建一个更大的阵列的优势在于它确实简化了你的逻辑,但我可以通过修改原始数组或使用与输入相同大小的第二个数组,使用更复杂的逻辑来实现它。 (再一次,简单地在输入中简单地设置全零的安全“围栏”)。

如果你没有用围栏“围绕”你的阵列,你会有很多额外的if / else检查:这会容易出错,导致更大的代码并导致更丑陋的代码。

答案 1 :(得分:2)

简短教程:

如果是1x1字段,您如何解决问题?
你怎么能递归地提出这个问题呢?
你怎么能记住中间结果并使用它们?
做吧。

答案 2 :(得分:0)

void rhombus()
{
    maxr=0;
    for (int i=n-1;i>=0;i--)
    {
        for (int j=n-1;j>=0;j--)
        {
            if (b[i][j]>0)
            {
                if ((i==n-1) || (j==n-1) || (i==0) || (j==0)) b[i][j]=1;
                else {
                    b[i][j]=min4(b[i][j+1],b[i][j-1],b[i+1][j],b[i-1][j])+1;
                    if (b[i][j]==maxr) nrr++;
                    else if (b[i][j]>maxr) {
                        nrr=1;
                        maxr=b[i][j];
                    }
                }
            }
        }
    }
}

它做到了,它有效,这是我的功能,其中maxr是菱形的最大尺寸,nrr是最大尺寸菱形的数量。不确定它如何在大型数组上工作。(我循环这个函数n / 2次)