0

大きな行列 M と m=M/2 で最小の部分行列 m の数を見つけるのに問題があります。

最小の部分行列を見つけるために、同じループ内の部分行列の数を見つける必要があります
。これが私が行ったことです。

public static void FindSmalSubMatrix(int mat3[][],int rows,int colums)
{
    int subm,i,j,temp=0,location1=0,location2=0, min=0;
    ArrayList submin = new ArrayList();
    if(rows>=colums)
      subm=colums/2;
    else
      subm= rows/2;
    min= Firstmin(mat3,subm);

    for (i=0;i<rows-subm+1;i++)
      for(j=0;j<colums-subm+1;j++)
      {
          for(int k=i; k <i+subm;k++)
              for (int l =j;l<j+subm;l++)
              {

                 temp=temp+ mat3[k][l];
              }

           if (temp <= min)
           {
               min=temp;
              submin.add(min);

              location1=i;
              location2=j;
           }

           temp=0;
      }
    System.out.println(min+" location is :"+location1+" "+location2);
    for( Object value:submin)
      System.out.print(value); 
}

そして、ここに例があります

6 6 4 4 3
2 2 3 3 8
5 0 2 2 5
4 9 2 1 4
1 6 8 1 3
7 場所は :2 2

161514977

しかし、その min =7 Location :1 1
2 3
0 2を出力する必要があります

分 =7
位置 :2 2
2 2
1 2

誰かが私を助けることができれば、私はそれを大いに感謝します。

4

1 に答える 1

0

あなたのコードはそれほど悪くありません。それをデバッグして、サブミンに保存されているものを確認しようとしましたか? 16,15,14,9,7,7 のように見えるからです (最後の 2 つの数字でいいですね) FirstMin とは何ですか?

public static void FindSmalSubMatrix(int mat3[][],int rows,int colums)
{
    int subm,i,j,temp=0,location1=0,location2=0, min=0;
    ArrayList<Point> locations = new ArrayList<Point>();
    if(rows>=colums)
      subm=colums/2;
    else
      subm= rows/2;
    min= Integer.MAX_VALUE;

    for (i=0;i<rows-subm+1;i++)
      for(j=0;j<colums-subm+1;j++)
      {
       temp = 0;
          for(int k=i; k <i+subm;k++)
              for (int l =j;l<j+subm;l++)
              {

                 temp=temp+ mat3[k][l];
              }

           if (temp < min)
           {
              locations.clear();  //you dont need data about larger min, right?
               min=temp;

              Point point = new Point(i,j);
              locations.add(point);

           } else (temp == min) {
              Point point = new Point(i,j);
              locations.add(point);

           }

      }
    // And to print use something like these, but its better to create new class
    // which contain location and small matrixes or just use old bigger to print parts
    // for example just print location (min are equal to all result) and using   
    // location print parts from  mat3

}

私はこの例でいくつかの間違いを犯したと思いますが、あなたはそれを見つけるでしょう;)最小の行列の場所を保存するためだけに Point クラスを使用しました。別のクラスを使用できます

編集: コードが醜いので、少し修正する必要がありました(それでもとにかく...)

于 2012-09-18T07:06:44.030 に答える