-3

エラー ArrayIndexOutOfBounds: 4 が 21 行目に表示され続けます。この行は Spiral[VIndx][HIndx]=number です。このプログラムは、特定の次元が与えられたときに数のスパイラルを作成することになっています。たとえば、次元 3 が与えられた場合、数値をらせん状に並べる 3x3 の 2D 配列です。スパイラルは次のようになります。

7 8 9

6 1 2

5 4 3

ループが機能しないのはなぜですか?

   import java.util.*;import java.io.*;
   public class Spiral{

   public static void Spiral(int dimensions, int [][] Spiral)
   {
   int endNumber = (int)Math.pow(dimensions, 2);
   int number = 1;

   int rightmovement = 1;
   int downmovement = 1;
   int leftmovement = 2;
   int upmovement = 2;

   int HIndx = (dimensions-1)/2;
   int VIndx = (dimensions-1)/2;

   while(number<=endNumber)
   {
for(int i = 0;i<=rightmovement;i++)
{
   Spiral[VIndx][HIndx]=number;
   number++;
   HIndx++;
   if(number==endNumber)break;
}
rightmovement++;


for(int i = 0;i<=downmovement;i++)
{
Spiral[VIndx][HIndx]=number;
number++;   
VIndx++;
if(number==endNumber)break;
}
downmovement++;


for(int i = 1;i<=leftmovement;i++)
{
 Spiral[VIndx][HIndx]=number;
number++;   
HIndx--;
if(number==endNumber)break;
}
leftmovement++;


for(int i = 1;i<=upmovement;i++)
{
 Spiral[VIndx][HIndx]=number;
number++;   
VIndx--;
if(number==endNumber)break;
}
upmovement++;

 }

 }
 public static void main(String[]args)throws IOException
 {
 File file = new File("spiral.txt");
 Scanner input = new Scanner(file);
 String [] numbers = new String [2];
 int i =0;
 while (input.hasNextLine())
 {
 String line = input.nextLine();
 numbers[i]=line;
 i++;
 }
 int dimensions = 0;
 input.close();
 int [][] Spiral = new int [dimensions][dimensions];  

 dimensions = Integer.parseInt(numbers[0]);
 int range = Integer.parseInt(numbers[1]);
  if(dimensions%2==0)
  {
    dimensions+=1;
  }

 Spiral(dimensions, Spiral);

 for(i = 0; i<dimensions;i++){
   for(int j = 0; j<dimensions;j++){ 
   System.out.println(Spiral[i][j]);
                       }
        }

     }
           }
4

1 に答える 1

0

まず、ループ条件は<ではなくを使用する必要があります<=

第二に、スパイラルについて考えると、常に正しい動きで終わることがわかります。breakあなたはあなたが持っている最初の時間にヒットしました

if(number==endNumber)break;

しかし、これはループから抜け出すわけではありませんwhile- これはforループを離れるだけです。したがって、下方向の動きのforループに入り、インデックスが範囲外の例外を取得します。

3 番目に、ループの前にまずセンター番号を入力する必要があります。

さらに、rightmovementleftmovement、 ... はすべて 2 ずつ増加する必要があります。この理由は、グリッドが大きいほど見やすくなります。

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

最初の右の動きが を書き2、次に次の動きが を書き8 9 10、最後の動きが を書き、続けていれば22 23 24 25書いていたことに注意してください。26

ループbreakを離れないという問題を解決するには、それをステートメントに変更するだけです。whilereturn

于 2013-04-04T21:48:27.030 に答える