#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion var n = I(); var m = I(); var gz = new bool[n][,]; for (var i = 0; i < n; i++) { var g = new bool[m, m]; for (var j = 0; j < m; j++) { var str = I(); for (var k = 0; k < m; k++) g[j, k] = str[k] == '#'; } gz[i] = g; } var b = 1 << (n * 2); var ans = m * m; for (var s = 0; s < b; s++) { var sg = new bool[m, m]; var cs = s; for (var i = 0; i < n; i++) { var r = cs & 3; cs >>= 2; var g = gz[i]; while (r-- > 0) g = g.Rotated(); for (var j = 0; j < m; j++) for (var k = 0; k < m; k++) sg[j, k] |= g[j, k]; } var sns = 0; for (var j = 0; j < m; j++) for (var k = 0; k < m; k++) if (sg[j, k]) sns++; ans = Math.Min(ans, sns); } Console.WriteLine(ans); static class Extensions { public static T[,] Rotated(this T[,] g) { var (h, w) = (g.GetLength(0), g.GetLength(1)); var res = new T[w, h]; for (var i = 0; i < h; i++) for (var j = 0; j < w; j++) res[w - 1 - j, i] = g[i, j]; return res; } }