これを行列としてモデル化できる場合、必要な情報は頂点の位置だけです。次に、頂点ごとに同じ行のすべての頂点をチェックし、見つかった頂点ごとにそれらの列をチェックします。次に、処理された頂点を削除します。列ごとに同じことを行います。最悪の場合の複雑さは n! (?)
明確にするためにコードを追加しました。
public class SqFinder {
int calculateSquares(int[][] vertices, int n) {
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (vertices[i][j] == 1) {
for (int k = 1; k < n-j; k++) {
if (i + k < n && vertices[i][j+k] == 1 && vertices[i + k][j] == 1 && vertices[i + k][j + k] == 1)
count++;
}
}
vertices[i][j] =0;
}
}
return count;
}
public static void main(String[] args) {
SqFinder a = new SqFinder();
// int [][] test = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
int [][] test = {{1,1,1},{1,1,1},{1,1,1}};
System.out.println(a.calculateSquares(test, 3));
}
}