2013-05-05 55 views
0

所以我今天花了幾個小時寫出邏輯,並將它變成代碼,但我完全停留在這一點上,我不知道該怎麼做。我現在只用java編程了幾個月,所以整個「邏輯」思維模式還沒有完成。任何人都可以幫助我思考如何在java中創建一個ulam螺旋的邏輯?如何在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; 
} 
} 

在這一點上,做我需要做什麼來完成創建烏拉螺旋什麼?我現在正在處理的是數組跟蹤一個位置,遍歷一行中的每個步驟,然後下拉並遍歷列中的步驟,然後向每個計數器加1並繼續。幫幫我? 對於糟糕的格式,抱歉,這個網站在粘貼代碼時並沒有真正的幫助:... |

+1

烏蘭螺旋是素數的陰謀。你在哪裏計算素數? (順便說一下,你的'isOdd'方法可以大大簡化爲單行體:'return(num&1)== 1;'。)另外,你的'findArrayCenter'邏輯是不必要的。由於'center'是一個'int','center/2'自動將結果截斷爲一個'int';因此,你可以簡單地'返回中心/ 2;'。 – 2013-05-05 04:48:02

+0

我以後會計算它是否爲素數,現在我正在專注於使螺旋螺旋工作。並感謝關於尋找中心的提示,並測試它是否奇怪。 – 2013-05-05 05:13:21

回答

4

你不清楚你的代碼有什麼問題;最好明確一下你想要什麼樣的行爲,以及你正在觀察什麼樣的行爲,以及你在什麼地方停留在讓它們匹配的地方。

但是,我建議你先打印一個簡單的數字螺旋圖案。從Wikipedia article on the Ulam spiral,基本螺旋看起來是這樣的:

number spiral

螺旋的小書房裏顯示了一些有趣的特性。從中心開始(打印「1」),在對角線上向下和向右,您可以看到所有奇數個正方形。 (每行保存最後一個擴展一個過去的廣場,包括(2k + 1) +1。)同樣,向上和對角線上的左側,你會看到表單的所有數字(2k) + 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) +1。這是從中心座標(r,r)。
  • 在行r(回憶r < = 0)上依次有1-2r個連接的數字,按從小區(r,r)到小區(-r,r)的降序從左到右。 (例如,對於r = -1,在單元格(-1,-1),(0,-1),(1,-1)處的序列是「5 — 3」。)
  • 每行有2N + 1個數字,將(N + r)個數字留在連接序列的左側和右側。(c,c)處的數字(其從上面開始是(2c> r))獲得的數目是通過將rc加到在行r(≤0)上的行r上的每個單元(c,r) (c,c)處的數字加上c + r得到的數字(其來自於(c,r)),其中,下面第一個規則,是(2C + 1))。

ř≥0

  • 行r上主對角線上的數字是(2r + 1)。
  • 對於r < N,在行r上按照從小區(-r,r)到小區(r,r + 1)的升序從左到右依次有2r + 2個連接的數字。 (例如,「7 10」)。在最後一行(r = N),只有2N + 1個連接的數字,因爲這是我們截斷螺旋的地方。
  • 每行有2N + 1個數字,左邊的(N-r)數字和連接的序列右邊的(N-r-1)數字。
  • 對於行r上的每個單元(c,r),c是< -r,該數是通過將r -c加到單元(c,c)處的數字獲得的。
  • 對於行r上的每個單元(c,r),其中c>r + 1,該數是通過將c-r加到單元(c,c)處的數字上而獲得的。

從這些規則,你應該能夠創建一個算法打印出一個螺旋的任意N型> 0.我沒有解決細胞之間的垂直連接的問題,但你可以申請一個類似的分析發現繪製它們的規則。對於正確的格式化,您應該爲每個單元格選擇一個固定寬度(顯然,它應該足夠大,以適合最大數量,(2N + 1))。