【问题标题】:how to make a ulam spiral in java? [closed]如何在java中制作一个ulam螺旋? [关闭]
【发布时间】:2013-05-05 04:21:49
【问题描述】:

所以我今天花了几个小时写出逻辑,并将其转化为代码,但我完全卡在这一点上,我不知道该怎么办。我现在才用 java 编程几个月,所以整个“逻辑”思维方式还没有完全成熟。谁能帮我想想如何在java中创建一个ulam螺旋的逻辑?

import java.util.Arrays;

public class GridMaker {
    private static int gridRow = 5; // R = length
    private static int gridCol = 5; // C = height
    private static int[][] grid = new int[gridRow][gridCol];
    private static int totalSteps = (gridRow * gridCol); // total blocks on the grid
    private static int location = 1; // location refers to the number in the box, ie. 1, 2, 3, etc.
    private static int rowLength = 1;

    public static void main(String[] args) {
        grid[Calc.findArrayCenter(gridRow)][Calc.findArrayCenter(gridRow)] = 1;
        rowBrowser();
        colBrowser();

    for (int r = 0; r < gridRow; r++){
        for (int c = 0; c < gridCol; c++){
            System.out.print(grid[r][c] + " ");
        }
        System.out.println("");
    }
}

public static void rowBrowser() {
    int rowCount = 1;
    int x = 1;
    int stepsInvolved = 2;

    if (x < stepsInvolved) {
        if (Calc.isOdd(rowCount) == true) {
            grid[Calc.findArrayCenter(gridRow)][Calc.findArrayCenter(gridCol) + x] = location + 1;
            stepsInvolved++;
        }
    }
    location++;
    x++;
}

private static void colBrowser() {

}
}

    public class Calc {
public static int findArrayCenter(int center) {
    int fcenter = 0;
    if (center % 2 != 0)
        fcenter = (int) ((center / 2));
    else
        fcenter = (center / 2);
    return fcenter;
}

public static boolean isOdd(int num) {
    boolean result = true;
    if (num % 2 == 0)
        result = false; // false = even, true = odd
    return result;
}
}

此时,我需要做什么才能完成 ulam 螺旋的创建?我现在正在做的是让数组跟踪一个位置,遍历一行的每个步骤,然后下拉并遍历一列中的步骤,然后将每个计数器加 1 并继续。帮助? 对于糟糕的格式感到抱歉,这个网站在粘贴代码方面并没有太大帮助......:|

【问题讨论】:

  • 乌拉姆螺旋线是素数图。你在哪里计算素数? (顺便说一句,您的isOdd 方法可以大大简化为一行代码:return (num &amp; 1) == 1;。)此外,您的findArrayCenter 逻辑是不必要的。由于centerintcenter/2 自动将结果截断为int;因此,您可以简单地return center / 2;
  • 我打算稍后计算它是否是质数,现在我专注于使该死的螺旋工作。感谢您提供有关找到中心并测试它是否奇怪的提示。

标签: java spiral


【解决方案1】:

您不清楚您的代码有什么问题;最好明确说明您想要什么行为以及您正在观察什么行为,以及您在使它们匹配时遇到的具体问题。

但是,我建议您从打印简单的数字螺旋图案开始。从Wikipedia article on the Ulam spiral来看,基本螺旋是这样的:

对螺旋的一点研究表明了一些有趣的特性。从中心(打印“1”的位置)开始,在对角线上向下和向右,您会依次看到所有奇数方块。 (除最后一行外,每一行都延伸到正方形之外,包括 (2k+1)2+1。)同样,在对角线上向上和向左,您会看到表格的所有数字(2k)2 + 1(一加偶数平方)。您可以使用这些属性来计算螺旋线每一行的边界。

假设要打印2N+1行和列的螺旋线(图中,N=3)。假设中心行是第 0 行第 0 列,因此行和列索引的范围从 -N 到 +N(含)。想象一个 (2N+1) × (2N+1) 的细胞矩阵是有意义的。我们的工作是决定如何填写这个矩阵。

在这一点上,有几种方法可以解决这个问题。在一种方法中,您通过确定每个整数 1、2、... 等的位置来填充它,从单元格 (0, 0) 处的“1”开始。另一种方法是为每个单元格 (c, r) 决定其中的整数。

让我们采用后一种方法。我们可以观察到第 r 行的以下属性:

r ≤ 0

  • 第 r 行主对角线上的数字是 (2r)2+1。这是距中心的坐标 (r, r)。
  • 在第 r 行上依次有 1-2r 个连接数(请记住 r
  • 每行有 2N+1 个数字,因此在连接序列的左侧和右侧留下 (N+r) 个数字。
  • 对于行 r 上的每个单元格 (c, r),其中 c 2+1)。
  • 对于行 r 中 c > -r 的每个单元格 (c, r),通过将 c+r 与单元格 (c, c) 处的数字相加得到数字(根据下面的第一条规则,该数字是 ( 2c+1)2)。

r≥0

  • 第 r 行主对角线上的数字是 (2r+1)2
  • 对于 r
  • 每行有 2N+1 个数字,将 (N-r) 个数字留在连接序列的左侧,将 (N-r-1) 个数字留在连接序列的右侧。
  • 对于 c
  • 对于第 r 行中 c > r+1 的每个单元格 (c, r),通过将 c-r 与单元格 (c, c) 处的数字相加得到数字。

根据这些规则,您应该能够创建一个算法来打印出任何 N > 0 的螺旋。我没有解决单元之间的垂直连接问题,但您可以应用类似的分析来发现规则用于绘制它们。对于正确的格式,您应该为每个单元格选择一个固定的宽度(显然,对于最大的数字 (2N+1)2,它应该足够宽)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多