java - 如何在 java 中制作 ulam 螺旋?

标签 java spiral

<分区>

所以我今天花了几个小时写出逻辑,并将其转化为代码,但我完全卡在了这一点上,我不知道该怎么做。我现在才用 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 并继续。帮助? 对于糟糕的格式感到抱歉,这个网站在粘贴代码时并没有太大帮助......:|

最佳答案

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

但是,我建议您先打印一个简单的数字螺旋图案。来自Wikipedia article on the Ulam spiral ,基本的螺旋线看起来像这样:

number spiral

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

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

此时,有几种方法可以解决这个问题。在一种方法中,您通过确定每个整数 1、2、... 等的去向来填充它,从“1”开始到单元格 (0, 0)。另一种方法是为每个单元格 (c, r) 决定其中包含什么整数。

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

r≤0

  • 第 r 行主对角线上的数字是 (2r)2+1。这是在距离中心的坐标 (r, r) 处。
  • 第 r 行有 1-2r 个连续的数字(回想一下 r <= 0),从单元格 (r, r) 到单元格 (-r, r) 从左到右按降序排列。 (例如,对于 r=-1,序列在单元格 (-1, -1)、(0, -1)、(1, -1) 处为“5—4—3”。)
  • 每行有 2N+1 个数,在相连序列的左右各留 (N+r) 个数。
  • 对于第 r 行中 c < r(≤ 0)的每个单元格 (c, r),该数字是通过将 r-c 与单元格 (c, c) 中的数字相加获得的(从上面看,它是 (2c> 2+1).
  • 对于第 r 行中 c > -r 的每个单元格 (c, r),该数字是通过将 c+r 与单元格 (c, c) 中的数字相加获得的(根据下面的第一条规则,该数字是 ( 2c+1)2).

r≥0

  • 第r行主对角线上的数是(2r+1)2
  • 对于 r < N,在第 r 行有 2r+2 个连续的数字,从单元格 (-r, r) 到单元格 (r, r+1) 从左到右按升序排列。 (例如,“7—8—9—10”。)在最后一行 (r=N) 中,只有 2N+1 个相连的数字,因为这是我们截断螺旋的地方。
  • 每行有2N+1个数,左边有(N-r)个数,右边有(N-r-1)个数。
  • 对于第 r 行中 c < -r 的每个单元格 (c, r),通过将 r-c 与单元格 (c, c) 中的数字相加得到数字。
  • 对于第 r 行中 c > r+1 的每个单元格 (c, r),该数字是通过将 c-r 与单元格 (c, c) 中的数字相加得到的。

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

关于java - 如何在 java 中制作 ulam 螺旋?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381371/

相关文章:

java - 如何修复线程 "main"java.lang.NoClassDefFoundError : javax/xml/bind/DatatypeConverter中的异常

javascript - JS 在 JavaScript 中绘制多色螺旋

java - 在java中生成螺旋矩阵的算法

model - 敏捷模型和螺旋模型的区别

java - 重用部分流映射和过滤来组成两个不同的结果

java - 使用 Java 字符串时的提示和技巧,以提高性能和安全性

java - 如何使用 K-Means 算法查找异常/离群值

c++ - 如何在 C++ 中逆时针读取 char 矩阵?

algorithm - 螺旋式循环

java - 我可以在 for 循环中对计数器进行异常(exception)处理吗?