0

このプログラムの最初の部分は、次元が 2 から 6 の行列をランダムに生成することでした。次に、この行列をランダムに 1 と 0 で埋める必要がありました。この行列を使用して、各行と列の 1 の数を含む 2 つの 1 次元配列を作成しました。行番号を表すマトリックスのインデックス、およびカウントを表すセル内の数値。これらの配列を 2 つ作成しました。1 つは行数用、もう 1 つは列数用です。これがそのための私のコードです。

    public static void count(int[][] matrix, int[] rowcount, int[] colcount)
  {
     for(int x = 0; x < rowcount.length; x++)
        for(int y = 0; y < colcount.length; y++)
        {
           if (matrix[x][y] == 1)
           {
              rowcount[x] = rowcount[x] + 1;
              colcount[y] = colcount[y] + 1;
           }
        }
  }

今私が直面している問題は、これらのカウントを使用してこのマトリックスを再作成することです。再作成とは、1 次元配列のカウントを満たす別の行列を作成することを意味します。これらのカウントが導出された正確な行列を生成する必要はありません。 これまでの私のコードは次のとおりです.2日間プログラムのためにこれに取り組んできましたが、すべてのケースのマトリックスを生成するアルゴリズムが見つかりません.

そのための方法は次のとおりです

    public static void re_create(int[] rowcount, int[] colcount)
  {
     int[][] recreated = new int[rowcount.length][colcount.length];
     recur(recreated, rowcount, colcount, 0, 0);
  }
  private static void recur(int[][] m, int[] rowcount, int[] colcount, int r, int c) //recursive helper method
  {
     if(compare(m, rowcount, colcount))    //base case: if new matrix works
     {
        System.out.println();
        System.out.println("RECREATED");
        display(m, rowcount, colcount);    //we're done!
        System.exit(0);
     }
     else
     { 
        int[] temp_r = new int[m.length];
        int[] temp_c = new int[m[0].length];
        count(m, temp_r, temp_c);
        if(rowcount[r] > temp_r[r] && colcount[c] > temp_c[c])
           m[r][c] = 1;
        if(r+1 < m.length)
           recur(m,rowcount,colcount,r+1,c);
        if(rowcount[r] < temp_r[r] || colcount[c] < temp_c[c])
           m[r][c] = 0;
        if(c+1 < m[0].length)
           recur(m,rowcount,colcount,r,c+1);     
     }
  }
  private static boolean compare(int[][] m, int[] rowcount, int[] colcount)
  {
     int[] temp_r = new int[m.length];
     int[] temp_c = new int[m[0].length];
     count(m, temp_r, temp_c);

     for (int x = 0; x < temp_r.length; x++)
     {
        if(temp_r[x] != rowcount[x])
           return false;
     }

     for (int y = 0; y < temp_c.length; y++)
     {
        if(temp_c[y] != colcount[y])
           return false;
     }

     return true; 
  }

プログラムは学校のものなので、メソッド ヘッダーと再帰メソッドのベース ケースは既に与えられているので、それらは同じままにしておく必要があります。それ以外はすべて私が書きました。これらの行列を生成するための適切なアルゴリズムが見つかりません。基本ケースに一致するまで、マトリックス内の 1 と 0 のすべての順列を生成することになっていると思いますが、 recur メソッドの引数が与えられた場合、それがどのように機能するかわかりません。

4

2 に答える 2

0

これが私が思いついた解決策です。私には正しいように思えますが、多くのテストデータを与えていません。

public static void re_create(int[] rowcount, int[] colcount) {
    int[][] recreated = new int[rowcount.length][colcount.length];
    for (int y = 0; y < rowcount.length; y++) {
        for (int x = 0; x < colcount.length; x++) {
            if (rowcount[y] > 0 && colcount[x] > 0) {
                recreated[x][y] = 1;
                rowcount[y]--;
                colcount[x]--;
            } else {
                recreated[x][y] = 0;
            }
        }
        if (rowcount[y] != 0) {
            throw new IllegalArgumentException("Impossible! y = " + y);
        }
    }
    for (int x = 0; x < colcount.length; x++) {
        if (colcount[x] != 0) {
            throw new IllegalArgumentException("Impossible! x = " + x);
        }
    }
    System.out.println(Arrays.deepToString(recreated));
}
于 2013-06-26T15:51:03.167 に答える
0

すべてのケースに有効な解決策はありません。検討:

0 1 0 0 | 1    0 0 1 0 | 1
1 0 1 0 | 2    0 1 0 1 | 2
0 1 0 1 | 2    1 0 1 0 | 2
0 0 1 0 | 1    0 1 0 0 | 1
-------        -------
1 2 2 1        1 2 2 1
于 2013-06-26T15:10:05.820 に答える