1

今日はロジックを書き、それをコードに変換するのに数時間を費やしましたが、この時点で完全に立ち往生しており、何をすべきかわかりません。私は Java でプログラミングを始めてまだ数か月しか経っていないので、「論理的な」考え方はまだ完全にはできていません。Javaでウラムスパイラルを作成する方法のロジックを考えるのを手伝ってくれる人はいますか?

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;
}
}

この時点で、ウラム スパイラルの作成を完了するにはどうすればよいですか? 私が今取り組んでいるのは、配列に位置を追跡させ、行全体の各ステップを実行してから、ドロップダウンして列のステップを実行し、その後各カウンターに 1 を追加して続行することです。ヘルプ?そしてひどいフォーマットで申し訳ありませんが、このサイトはコードの貼り付けに関してはあまり役に立ちません... :|

4

1 に答える 1

5

コードの何が問題なのかはっきりしません。必要な動作と観察している動作、およびそれらを一致させる際に具体的にどこに行き詰まっているかを明確にすることをお勧めします。

ただし、単純な数のスパイラル パターンの印刷から始めることをお勧めします。ウラム スパイラルに関するウィキペディアの記事から、基本的なスパイラルは次のようになります。

数スパイラル

スパイラルを少し調べてみると、いくつかの興味深い特性が示されています。中央 (「1」が印刷されている場所) から始めて、対角線上を下に右に行くと、すべての奇数の正方形が順番に表示されます。(最後の行を除く各行は、(2k+1) 2 +1 を含めるために、正方形を 1 つ超えて拡張されます。) 同様に、対角線を上に左に行くと、(2k) 2 + 1 ( 1 プラス偶数平方)。これらのプロパティを使用して、らせんの各行の境界を計算できます。

らせんの 2N+1 行と列を印刷するとします (図では、N=3)。中央の行を行 0、列 0 とすると、行と列のインデックスの範囲は -N から +N (両端を含む) になります。(2N+1) × (2N+1) セルの行列を想像するのは理にかなっています。私たちの仕事は、このマトリックスを埋める方法を決定することです。

この時点で、問題にアプローチする方法がいくつかあります。1 つのアプローチでは、セル (0, 0) に向かう "1" から始めて、各整数 1、2、... などをどこに置くかを決定することによって、それを埋めます。もう 1 つのアプローチは、セル (c, r) ごとに、そのセルに入る整数を決定することです。

後者のアプローチを取りましょう。行 r の次のプロパティを確認できます。

r≦0

  • 行 r の主対角線上の数は (2r) 2 +1 です。これは、中心からの座標 (r, r) にあります。
  • 行 r (r <= 0 を思い出してください) には、セル (r, r) からセル (-r, r) まで左から右に降順で 1 ~ 2r 個の接続された数字があります。(たとえば、r=-1 の場合、セル (-1, -1)、(0, -1)、(1, -1) では、シーケンスは "5—4—3" になります。)
  • すべての行に 2N+1 個の数字があり、接続されたシーケンスの左右に (N+r) 個の数字が残ります。
  • 行 r の各セル (c, r) (c < r (≤ 0)) について、セル (c, c) の数値に rc を加算することによって数値が得られます (上から、(2c> 2 +1 )。
  • 行 r の各セル (c, r) (c > -r) について、セル (c, c) の数値に c+r を加算することによって数値が得られます (以下の最初の規則から、(2c+1 ) 2 )。

r≧0

  • 行 r の主対角線上の数は (2r+1) 2です。
  • r < N の場合、セル (-r, r) からセル (r, r+1) まで左から右へ昇順で行 r に 2r+2 個の接続された数値が順番に存在します。(たとえば、「7—8—9—10」。) 最後の行 (r=N) には、2N+1 個の接続された数字しかありません。これは、らせんを切り捨てる場所だからです。
  • すべての行に 2N+1 個の数字があり、接続されたシーケンスの左に (Nr) 個の数字、右に (Nr-1) 個の数字が残ります。
  • 行 r のセル (c, r) (c < -r) ごとに、セル (c, c) の数値に rc を加算して数値が得られます。
  • 行 r の各セル (c, r) (c > r+1) の場合、セル (c, c) の数値に cr を加算して数値が得られます。

これらのルールから、任意の N > 0 のスパイラルを出力するアルゴリズムを作成できるはずです。セル間の垂直方向の接続の問題については触れていませんが、同様の分析を適用して、セルを描画するためのルールを発見できます。 . 適切な書式を設定するには、各セルに固定幅を選択する必要があります (明らかに、最大数 (2N+1) 2に対して十分な幅である必要があります)。

于 2013-05-05T18:00:17.073 に答える