我有一个用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。
如果您有任何想法,请在此处发布。
答案 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次)