2011-12-05 14 views
0

可能性の重複:
Looping in a spiralJavaの作成

私は3×3の行列を移入するためのプログラムを作成しています。私はこのようなものになりたいと思っています。

5 4 3 
6 1 2 
7 8 9 

おそらく気付いていたように、螺旋状です。 ここで私が使用しているアルゴリズムはこれです:値が数値の座標を表す2次元配列を持っています。最初に、この配列内のすべての数値座標の値が10になるように割り当てます。次に9から始めて、x座標を小さくし、座標の値をcurrentnum-1に代入します。それから私はYの価値を上げる以外は同じことをします。次に、xの値を減らします。次にYの;

私はすべての番号に10を割り当てる理由は、それが私のプログラムの道として機能するようです。現在のnumは9を超えることはないため、正方形の値が10の場合は緑色の光のようになります。それが10の意味でない場合、値がその四角に割り当てられていれば、その値から切り離されます。ここで

が私のコードですが、私は、Javaに新たなんだので

public class spiral { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     int spiral [] [] = new int[3][3]; 
     for(int i = 0; i <= 2; i++){ 
      for(int j = 0; j <= 2; j++){ 
       spiral[i][j] = 10; 
      } 
     } 
     //0 is x value, 1 is y value 
     spiral[0][0] = 9; 
     int x = 1; 
     int y = 1; 
     int counter = 1; 
     int currentnum = 9; 
     int gridsquare = 3; 
     for(int i = 0; i <= 8; i++){ 

      if(counter == 5){ 
       counter = 1; 
      } 
      if(counter == 1){ 
       System.out.println(x + " " + y); 
       for(int j = 0;j <= 1;j++){ 
        if(spiral[x][y] == 10){ 
         spiral[x][y] = currentnum; 
         currentnum--; 
         x += 1; 
        } 
        else{ 
         y += 1; 
         break; 
        } 
       } 
      } 
      if(counter == 2){ 
       for(int k = 0; k <= 0; k++){ 
        System.out.print(x + " " + y); 
        if(spiral[x][y] == 10){ 
         spiral[x][y] = currentnum; 
         currentnum--; 
         y += 1; 
        } 
        else{ 
         x -= 1; 
         break; 
        } 
       } 
      } 
      if(counter == 3){ 
       for(int z = 0; z <= 0; z++){ 
        if(spiral[x][y] == 10){ 
         spiral[x][y] = currentnum; 
         currentnum--; 
         x -= 1; 
        } 
        else{ 
         y -= 1; 
         break; 
        } 
       } 
      } 
      if(counter == 4){ 
       for(int b = 0; b <= 0; b++){ 
        if(spiral[x][y] == 10){ 
         spiral[x][y] = currentnum; 
         currentnum--; 
         y -= 1; 
        } 
        else{ 
         x += 1; 
         break; 
        } 
       } 
      } 
      counter++; 
     } 
     System.out.print(currentnum); 
    } 
} 

が、私は誰かがかのう修正を提案してくださいます。このエラー

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 
    at spiral.main(spiral.java:44) 

を取得していますそれはJavaで書かれている注意してくださいこのため。私のアルゴリズムに問題がある場合は、私に知らせてください。

+3

デバッガを使用して問題を追い詰めるようにしてください。この種の質問は本当に難しいです。 – Beginner

+0

私はそれを狩ることができませんでした。私はデバッガに堪能ではないので – Tom

答えて

1

10:ゼロであらかじめ入力する必要はありません。

スパイラルを解決する最良の方法は、手動で行う方法を考えることです。コーナーで開始し、配列の非ゼロまたはエッジに当たるまで水平に移動します。その後、右折します。現在の番号がN * Nを過ぎると停止します。

今度は、アルゴリズムの各部分が何を意味するのかを見てみましょう:隅に開始

  • = 0のx = 0とyを設定することを意味します。
  • x = x + dx、y = y + dyを意味します。ここで、dxまたはdyは0で、dyまたはdxは1または-1です。
  • 右に向けるとは、dxをdyに、-dyをdxに割り当てることを意味します。ここで

それがコードにどのように見えるかです:

int current = 1; 
// Start in the corner 
int x = 0, y = 0, dx = 1, dy = 0; 
while (current <= N*N) { 
    // Go in a straight line 
    spiral[x][y] = current++; 
    int nx = x + dx, ny = y + dy; 
    // When you hit the edge... 
    if (nx < 0 || nx == N || ny < 0 || ny == N || spiral[nx][ny] != 0) { 
     // ...turn right 
     int t = dy; 
     dy = dx; 
     dx = -t; 
    } 
    x += dx; 
    y += dy; 
} 
0

xまたはy3がいずれかの配列の末尾を超えて増加しました。

デバッガでプログラムをステップ実行するか、System.out.printlnステートメントをそれぞれif (counter)の前に追加して、どこでこれを実行しているかを確認します。