-1

与えられた行列が他の行列のサブ行列であることを見つけたいと思います。

以下のコードを試しましたが、うまくいくかどうかわかりません:-

for (int i = 0; i < a.length - b.length + 1; i++) {
    for (int j = 0; j < a[0].length - b[0].length + 1; j++) {
        boolean submatrix = true; // at start we assume we have a submatrix
        for (int k = 0; k < b.length; ++k) {
            for (int l = 0; l < b[0].length; ++l) {
                if (a[i + k][j + l] == b[k][l]) {
                    Console.WriteLine("a[" + (i + k) + "][" + (j + l) + "] = b[" + k + "][" + l + "]");
                } else {
                    submatrix = false; // we found inequality, so it's not a submatrix
                }
            }
        }
        if (submatrix) {
            Console.WriteLine("Found subatrix at " + i + "," + j + ".");
        }
    }
}

提案してください??

4

1 に答える 1

2

提案された方法は正しいです。私が修正した構文と制御フローの問題はごくわずかです。

この方法は、次元行列ではなく、 2D行列の部分行列を検出する場合にのみ役立つことを指摘することが重要です。

データ型はのギザギザの配列であると想定しましたが、int簡単に変更できます。

private static bool IsSubMatrix(int[][] a, int[][] b)
{
     for (int i = 0; i < a.Length - b.Length + 1; i++)
     {
         for (int j = 0; j < a[0].Length - b[0].Length + 1; j++)
         {
              bool found = true;
              for (int k = 0; k < b.Length; ++k)
              {
                  for (int l = 0; l < b[0].Length; ++l)
                  {
                      if (a[i + k][j + l] != b[k][l])
                      {
                          found = false;
                          break;
                      }
                  }
                  if (!found) break;
              }
              if (found) return true;
          }
      }          
      return false;
 }

これもおそらく最速の実装ではありません。

于 2012-09-12T16:38:35.197 に答える