2

質問したくなかったのですが、私はこの割り当てを理解できず、助けを求めたときに TA も理解できませんでした。

テキスト ファイルから入力を取得し、ファイル内の整数を配列リストに入れ、それが anxn 魔方陣かどうかをテストする必要があります。n は、配列リストの長さの平方根に等しくなります。完全な正方形でない場合は、すぐに魔方陣テストに失敗します。

とにかく、私はそれをほぼ完成させました。魔方陣テストの最後のステップで、教授が何を言っているのか、何をするように私たちに求めているのかを理解していないようです.

これらの最後の 4 つのステップの前のすべてのテストは問題なく動作します。手順の後に現在のコードを投稿します。

  1. rowSums と colSums を、エントリがすべてゼロの、長さ n の 2 つの配列とします。また、sumDiagMajor と sumDiagMinor は、それぞれテーブルの左上から右下、右上から左下の対角線に沿ったエントリの合計を表します。

  2. インデックス = 0 とする

  3. index = n2 まで繰り返す。 (a) rowSums[row] を ArrayList{index} だけインクリメントする。 (b) colSums[col] を ArrayList{index} だけインクリメントする。 (c) row = col の場合、sumDiagMajor を ArrayList{index} だけインクリメントする。(d) 行 + 列 = n-1 の場合、sumDiagMinor を ArrayList{index} だけ増やします (e) インデックスを 1 つ増やします

  4. sumDiagMajor が sumDiagMinor および rowSums と colSums の各エントリと等しい場合、テーブルは魔方陣です。そうでない場合は、そうではありません。

   int rowSums[] = new int[_n];
   int colSums[] = new int[_n];
   int sumDiagMajor = 0;
   int sumDiagMinor = 0;

   int row, col;
   row = col = 0;

   for (int index = 0; index < (n*n); index++)
   {          
       rowSums[row] = rowSums[row] + magicSquare.get(index);
       colSums[col] = colSums[col] + magicSquare.get(index);

       if (row == col)
       {       
           sumDiagMajor = sumDiagMajor + magicSquare.get(index);   
       }

       if ((row + col) == (n - 1))
       {
           sumDiagMinor = sumDiagMinor + magicSquare.get(index);   
       }

   }

   System.out.println(sumDiagMajor);
   System.out.println(sumDiagMinor);

私の質問には、配列rowSumsとrowColsを適切にインクリメントしていますか? 彼は実際に行や列をどうするかを述べていないので、それらをゼロに初期化するのが最善の選択肢ですか?

これまでにすべて正しく行った場合、行は常に列と等しいため、sumDiagMajor が sumDiagMinor と等しくなることはありません。したがって、2 番目にネストされた if ステートメントは実行されません。したがって、すべてのテストが魔方陣であるとして除外されますか?

長い投稿で申し訳ありませんが、これは非常に紛らわしいです。

4

2 に答える 2

0

あなたは決して変更rowせずcol、バグである for ループに入れます。理解を容易にするために、rowIndex と colIndex に対して 2 つのネストされた for ループを使用し、次のように小さなヘルパーを使用して 1-D 配列から値を取得することをお勧めします。

int getValue(int row, int col){
    return magicSquare.get( row * _n + col );
}

1 次元配列が (0,0)、(0,1)、... (0,_n)、(1, 0)、... (_n、 _n)

わかりやすくするために: インデックスを使用する代わりに、正方形を反復処理します。

for( int row = 0 ; row < _n ; row++){
    for( int col = 0 ; col < _n ; col++){
       // Your stuff here.
    }
}
于 2015-11-10T08:06:08.210 に答える